繁体   English   中英

Oracle 11g:使用自动增量long值将列添加到EXISTING表中

[英]Oracle 11g: add a column to an EXISTING table with auto increment long value

我有一个表,说Name(为简单起见,我简化了示例)。 该表已经存在,并且具有数据。 现在,我需要向其添加一个long类型的ID列,并需要使该值自动递增。

对于Oracle 12c,这很容易生成,始终以identity身份生成

但是,我正在使用Oracle 11g,并且不支持该功能。 因此,我需要创建一个触发器,如本博文所述: 如何在Oracle上使用AUTO_INCREMENT创建ID?

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”发布的“ update”语句来更新现有行

  2. 上面仍然需要一个触发器来插入将要插入的任何新行。

创建序列后,只需更新现有行:

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

在添加ID列并按照您提到的那样创建NAME_SEQ序列之后,而不是使用循环,一个更简单的选择是使用Update语句,如下所示:

update NAME set ID= NAME_SEQ.nextval ;

这应该可以解决问题

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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM