我有一张表,比如Name,(为简单起见,我简化了示例)。该表已存在,并且有数据。现在,我需要添加一个long类型的ID列,并且需要使值自动递增。
对于Oracle 12c,这很容易,始终以身份生成。
但是,我使用的是Oracle 11g,并且不支持此功能。所以我需要创建一个触发器,如本文所述:How to create id with AUTO_INCREMENT on Oracle?
alter table name add (id integer);
create sequence name_seq;
create or replace trigger name_bir;
before insert on name
for each row
begin
select name_seq.NEXTVAL
into :new.id
from dual;
end;
但是,该解决方案(在插入/更新时创建序列,然后是触发器)仅在插入新行时有效。它不适用于表中的现有行。
我很感激任何建议。基本上,我需要同时使用现有和新插入的行来获取新添加的列ID的新ID值。
=============================
解决方案(从答案中收集):
使用"更新"由" a_horse_with_no_name"发布的声明更新现有行
对于要插入的任何新行,仍需要上面的触发器。
答案 0 :(得分:4)
创建序列后,只需更新现有行:
alter table name add (id integer);
create sequence name_seq;
update name
set id = name_seq.nextval;
commit;
在LOOP中不需要PL / SQL或慢速且无效的逐行处理。
不相关,但是:触发器中的赋值可以简化为:
:new.id := name_seq.NEXTVAL;
无需select .. from dual
答案 1 :(得分:-1)
如上所述添加ID列并创建NAME_SEQ序列,而不是使用循环,更简单的选择是使用Update语句,如下所示:
update NAME set ID= NAME_SEQ.nextval ;
答案 2 :(得分:-2)
这应该可以解决问题
BEGIN
alter table name add (id integer);
create sequence name_seq;
FOR REC IN (SELECT * FROM NAME) LOOP
UPDATE NAME SET ID = NAME_SEQ.NEXTVAL
WHERE ROWID = REC.ROWID;
END LOOP;
END;