首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Oracle 11g:向具有自动增量长值的现有表中添加列

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

Stack Overflow用户
提问于 2017-01-06 09:00:28
回答 3查看 2.5K关注 0票数 0

我有一个表,比如名称(我简化了示例,以求简单)。此表已经存在,并具有数据。现在,我需要向它添加一个long类型的ID列,并且需要使值自动递增。

对于Oracle 12c,这是很容易的,因为生成总是作为标识。

但是,我在Oracle 11g上工作,不支持这样的特性。因此,我需要创建一个触发器,如本文所述:INCREMENT on Oracle?

代码语言:javascript
运行
复制
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;

但是,该解决方案(创建序列,然后在Insert/Update上设置触发器)仅在插入新行时才能工作。它不适用于表中现有的行。

如果有任何建议我会很感激的。基本上,我需要现有的newly-inserted行和行为新添加的列ID提供新的ID值。

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

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

  1. 使用"a_horse_with_no_name“发布的" update”语句更新现有行
  2. 对于要插入的任何新行,仍然需要上面的触发器。
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-01-06 10:14:32

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

代码语言:javascript
运行
复制
alter table name add (id integer);

create sequence name_seq;

update name 
  set id = name_seq.nextval;
commit;

不需要PL/SQL或循环中缓慢和高效的逐行处理。

无关的,但是:触发器中的分配可以简化为:

代码语言:javascript
运行
复制
:new.id := name_seq.NEXTVAL;

不需要select .. from dual

票数 4
EN

Stack Overflow用户

发布于 2017-01-06 10:16:57

如前所述,在添加ID列并创建NAME_SEQ序列之后,使用循环更容易的选项是使用更新语句,如下所示:

代码语言:javascript
运行
复制
update NAME set ID= NAME_SEQ.nextval ;
票数 -1
EN

Stack Overflow用户

发布于 2017-01-06 09:32:21

这应该能起作用

代码语言:javascript
运行
复制
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;
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41502140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档