UPDATE语句生成行号

时间:2014-02-19 10:30:08

标签: sql oracle oracle10g

Oracle 10g

我有一个包含复合键的表,我想用单数键替换它。所以我添加了一个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 个答案:

答案 0 :(得分:2)

你可以这样做:

update MyTable set NewId = rownum;

SQL Fiddle

但是可能你想要为将来的插入增加NewId列,很可能是一个序列,也许是一个触发器。您需要以您手动设置的最高值(即运行更新时表中的行数)开始序列,因此您可以在此处使用序列:

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

SQL Fiddle

两者都假设这是一个纯合成键,你不想强加任何排序。

答案 1 :(得分: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;