2014-02-19 138 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;