【问题标题】:Add a auto increment primary key to existing table in oracle [duplicate]向oracle中的现有表添加自动增量主键[重复]
【发布时间】:2012-07-12 22:40:27
【问题描述】:

我想将一个新的自动增量主列添加到现有的包含数据的表中。我该怎么做?

我首先添加了一个列,然后尝试添加一个序列,我失去了如何插入该列并将该列作为主键。

【问题讨论】:

  • 令人震惊的是,这个问题已经被浏览了近 27000 次,但只有 16 次点赞。

标签: oracle


【解决方案1】:

假设您的表称为t1,您的主键称为id
首先,创建序列:

create sequence t1_seq start with 1 increment by 1 nomaxvalue; 

然后创建一个在插入时递增的触发器:

create trigger t1_trigger
before insert on t1
for each row
   begin
     select t1_seq.nextval into :new.id from dual;
   end;

【讨论】:

  • 我可以更改新列的列 ID
  • 是的,这正是:new.id 正在做的事情
  • 11g中不需要select into,直接给:new.id赋值即可。
  • 不得不从隐士的回答中获取顺序。
【解决方案2】:

如果您有列和序列,则首先需要为所有现有行填充一个新键。假设您不在乎哪个键分配给哪一行

UPDATE table_name
   SET new_pk_column = sequence_name.nextval;

完成后,您可以创建主键约束(这假设没有现有的主键约束或者您已经删除了现有的主键约束)

ALTER TABLE table_name
  ADD CONSTRAINT pk_table_name PRIMARY KEY( new_pk_column )

如果要自动生成密钥,则需要添加触发器

CREATE TRIGGER trigger_name
  BEFORE INSERT ON table_name
  FOR EACH ROW
BEGIN
  :new.new_pk_column := sequence_name.nextval;
END;

如果你使用的是旧版本的 Oracle,语法会比较麻烦

CREATE TRIGGER trigger_name
  BEFORE INSERT ON table_name
  FOR EACH ROW
BEGIN
  SELECT sequence_name.nextval
    INTO :new.new_pk_column
    FROM dual;
END;

【讨论】:

  • 我已经完成了上面的代码,它工作正常。但是列 id 值被更改,最后插入的列得到了最后一列 id。但是如果我们的一些同事将数据插入到表中,他们从插入主键列值开始,那么它会显示错误。有什么办法可以更改列ID。
  • @mallikarjun - 我很难理解你在问什么。确切地说,有人在做什么?究竟是什么错误?
  • 我可以更改新主键的列 ID
  • @mallikarjun - “列 ID”是什么意思?你到底想改变什么?您是否尝试更改表中列的顺序?
  • 10gR2 需要第二个触发查询(SELECT INTO)
【解决方案3】:

来自Oracle OTN forums

使用alter table添加列,例如:

alter table tableName add(columnName NUMBER);

然后创建一个序列:

CREATE SEQUENCE SEQ_ID
START WITH 1
INCREMENT BY 1
MAXVALUE 99999999
MINVALUE 1
NOCYCLE;

并且,使用update 在这样的列中插入值

UPDATE tableName SET columnName = seq_test_id.NEXTVAL

【讨论】:

  • 我可以更改新列的列 ID
  • 您的意思是希望该列成为表中的第一列而不是表的末尾?
  • 无论如何,如果是这样,除了删除和重新创建表之外,在 oracle 中答案是否定的。通常,列的顺序是无关紧要的。如果您要求列按特定顺序排列,我建议您创建一个表格视图,其中列按您想要的顺序排列。
  • 是的,我想把这个 pk 添加为 row id 1
  • 是的,就像我之前说的,您在 oracle 中的选择是删除并重新创建表(重命名表,以正确的顺序创建新表,重新插入新表)...或只需简单地创建一个视图,按照您想要的顺序从您的表中进行选择。
【解决方案4】:

您可以使用 Oracle Data Modeler 创建自动递增代理键。

第 1 步 - 创建关系图

您可以先创建逻辑图和工程师来创建关系图,或者您可以直接创建关系图。

添加需要自动递增PK的实体(表),选择PK的类型为Integer。

第 2 步 - 编辑 PK 列属性

获取PK列的属性。 您可以双击列的名称或单击“属性”按钮。

出现列属性对话框。

选择常规选项卡(第一次默认选择)。 然后选中“自动增量”和“标识列”复选框。

第 3 步 - 附加信息

可以通过选择“自动增量”选项卡来指定与自动增量相关的其他信息。

  • 开始
  • 增量
  • 最小值
  • 最大值
  • 循环
  • 禁用缓存
  • 订购
  • 序列名称
  • 触发器名称
  • 生成触发器

提及序列名称通常是个好主意,这样它在 PL/SQL 中会很有用。

单击“确定”(应用)到“列属性”对话框。

在“表属性”对话框中单击“确定”(应用)。

表格出现在关系图中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-19
    • 2011-02-26
    • 1970-01-01
    • 2011-07-26
    • 2016-09-11
    • 2016-04-04
    相关资源
    最近更新 更多