Oracle 11g:向具有自动增量长值的EXISTING表添加列

时间:2017-01-06 09:00:29

标签: sql plsql oracle11g triggers

我有一张表,比如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值。

=============================

解决方案(从答案中收集):

  1. 使用"更新"由" a_horse_with_no_name"发布的声明更新现有行

  2. 对于要插入的任何新行,仍需要上面的触发器。

3 个答案:

答案 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;