Sql UPDATE语句以生成行号

Sql UPDATE语句以生成行号,sql,oracle,oracle10g,Sql,Oracle,Oracle10g,甲骨文10g 我有一个表,它有一个复合键,我想用一个单键替换它。因此,我添加了一个id列。现在我需要一个update语句来更新现有数据 例如: 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); 这不管用。这将把

甲骨文10g

我有一个表,它有一个复合键,我想用一个单键替换它。因此,我添加了一个id列。现在我需要一个update语句来更新现有数据

例如:

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。

试试这个

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;
您只需执行以下操作:

update MyTable set NewId = rownum;

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

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


两者都假设这是一个纯合成密钥,您不想在生成密钥时强加任何顺序。

Thx。在我的实际情况中,我有一个跟踪序列的表,所以我的实际查询类似于updatemytable SET NewID=ROWNUM+SELECT Seq FROM Seq_table,其中Name='MyTable';这是可行的:为什么您想要一个单独的表来跟踪序列,而不仅仅是使用本机序列?必须参考并更新该表才能连续插入?我正在定制现有的ERP系统。我不知道他们为什么选择一个单独的表来跟踪序列。