2014-02-19 62 views
0

Oracle 10gUPDATE語句生成行號

我有一個表有一個複合鍵,我想用一個單一的鍵替換。所以我添加了一個id列。現在我需要一個更新語句更新現有數據。

例子:

MyTable(NewID,CMP_Key1,CMP_Key2) 
NULL,1,1 
NULL,1,2 
NULL,2,2 
NULL,2,2 

需要更新到:

1,1,1 
2,1,2 
3,2,2 
4,2,2 

我試過到目前爲止:

Update MyTable SET NewID = (SELECT ROWNUM FROM DUAL); 

不工作。這將它們設置爲1。

回答

2

你可以這樣做:

update MyTable set NewId = rownum; 

SQL Fiddle

但大概你會想爲未來的插入增加NewId列,很可能是一個序列,也許是一個觸發器。你需要做的順序開始你手動設置(即表中的行,當您運行更新的數量)的最高值,所以你還不如干脆用這裏的順序:

create sequence MyTableSeq; 
update MyTable set NewId = MyTableSeq.nextval; 

SQL Fiddle

兩者都假設這是一個純合成密鑰,並且您不希望在生成它時施加任何排序。

+0

Thx。在我的實際情況中,我有一個跟蹤序列的表,所以我的實際查詢將類似於'UPDATE MyTable SET NewID = ROWNUM +(SELECT Seq FROM Seq_Table WHERE Name ='MyTable');'其中的作品:) – wvdz

+0

爲什麼你想要一個單獨的表來跟蹤序列,而不是僅僅使用本地序列?不得不引用並更新該表將使您的插入序列化? –

+0

我正在定製現有的ERP系統。我不確定爲什麼他們選擇了一個單獨的表來跟蹤序列。 – wvdz

0

試試這個

merge into mytable t 
using (select t.rowid rid, t.rownum id from mytable t) s 
on (t.rowid = s.rid) 
when matched then update set 
    t.newid= s.id; 

commit;