我有一个表,比如名称(我简化了示例,以求简单)。此表已经存在,并具有数据。现在,我需要向它添加一个long类型的ID列,并且需要使值自动递增。
对于Oracle 12c,这是很容易的,因为生成总是作为标识。
但是,我在Oracle 11g上工作,不支持这样的特性。因此,我需要创建一个触发器,如本文所述: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;
但是,该解决方案(创建序列,然后在Insert/Update上设置触发器)仅在插入新行时才能工作。它不适用于表中现有的行。
如果有任何建议我会很感激的。基本上,我需要现有的newly-inserted行和行为新添加的列ID提供新的ID值。
=============================
解决方案(从答复中收集):
发布于 2017-01-06 02:14:32
创建序列之后,只需更新现有行:
alter table name add (id integer);
create sequence name_seq;
update name
set id = name_seq.nextval;
commit;
不需要PL/SQL或循环中缓慢和高效的逐行处理。
无关的,但是:触发器中的分配可以简化为:
:new.id := name_seq.NEXTVAL;
不需要select .. from dual
发布于 2017-01-06 02:16:57
如前所述,在添加ID列并创建NAME_SEQ序列之后,使用循环更容易的选项是使用更新语句,如下所示:
update NAME set ID= NAME_SEQ.nextval ;
发布于 2017-01-06 01:32:21
这应该能起作用
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;
https://stackoverflow.com/questions/41502140
复制