簡體   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