Sql Oracle11g:使用自动递增的长值向现有表中添加列

Sql Oracle11g:使用自动递增的长值向现有表中添加列,sql,plsql,oracle11g,triggers,Sql,Plsql,Oracle11g,Triggers,我有一个表,比如说名字,为了简单起见,我简化了这个例子。此表已存在,并且包含数据。现在,我需要添加一个long类型的ID列,并需要使值自动递增 对于Oracle 12c,使用生成的始终作为标识很容易 但是,我使用的是Oracle 11g,不支持这种功能。所以我需要创建一个触发器,如本文所述: 但是,该解决方案创建一个序列,然后插入/更新触发器,只有在插入新行时才起作用。它不适用于表中的现有行 如果有任何建议,我将不胜感激。基本上,我需要现有的行和新插入的行为新添加的列ID提供新的ID值 ====

我有一个表,比如说名字,为了简单起见,我简化了这个例子。此表已存在,并且包含数据。现在,我需要添加一个long类型的ID列,并需要使值自动递增

对于Oracle 12c,使用生成的始终作为标识很容易

但是,我使用的是Oracle 11g,不支持这种功能。所以我需要创建一个触发器,如本文所述:

但是,该解决方案创建一个序列,然后插入/更新触发器,只有在插入新行时才起作用。它不适用于表中的现有行

如果有任何建议,我将不胜感激。基本上,我需要现有的行和新插入的行为新添加的列ID提供新的ID值

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

从答案中收集的解决方案:

使用带有\u no\u名称的\u horse\u发布的update语句更新现有行

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


这应该能奏效

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;

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

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;

无需选择。。从dual

添加ID列并创建NAME_SEQ序列(如您所述)而不是使用loop之后,更容易的选择是使用Update语句,如下所示:

update NAME set ID= NAME_SEQ.nextval ;

创建一个table_seq,只需编写一个查询,通过将table_seq.nexval添加到id column来循环表。您的意思是,我需要新插入行的触发器,以及现有行的循环,对吗?您不需要任何触发器。插入新行时只需使用table_seq.nextval,我对PL/SQL不太熟悉。您能给出语法示例吗?@kzharas210:PL/SQL中不需要慢循环来更新现有行。您甚至需要循环吗?不能使用简单的更新子句吗?@VimalBhaskar:不需要循环,请参阅我的answer@a_horse_with_no_name我已经查过了,兄弟。这很清楚。因此,我放弃了投票:
update NAME set ID= NAME_SEQ.nextval ;