[英]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值。
============================
解決方案(從答案中收集):
使用“ a_horse_with_no_name”發布的“ update”語句來更新現有行
上面仍然需要一個觸發器來插入將要插入的任何新行。
創建序列后,只需更新現有行:
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.