在oracle中向现有表添加自动增量主键

时间:2012-07-13 05:02:16

标签: oracle

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

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

4 个答案:

答案 0 :(得分:49)

假设您的表名为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;

答案 1 :(得分:28)

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

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;

答案 2 :(得分:16)

来自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

答案 3 :(得分:5)

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

步骤1. - 创建关系图

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

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

步骤2. - 编辑PK列属性

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

出现“列属性”对话框。

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

步骤3. - 其他信息

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

  • 开始
  • 增量
  • 最低价值
  • 最大值
  • 循环
  • 禁用缓存
  • 顺序
  • 序列名称
  • 触发器名称
  • 生成触发器

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

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

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

表格显示在关系图中。