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

mal*_*jun 66 oracle

我想将一个新的自动增量主列添加到具有数据的现有表.我怎么做?

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

alf*_*sin 49

假设您的表被调用t1并且您的主键被调用id
首先,创建序列:

create sequence t1_seq start with 1 increment by 1 nomaxvalue; 
Run Code Online (Sandbox Code Playgroud)

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

create trigger t1_trigger
before insert on t1
for each row
   begin
     select t1_seq.nextval into :new.id from dual;
   end;
Run Code Online (Sandbox Code Playgroud)

  • 在11g中不需要"select into",你可以将序列值直接赋值给`:new.id`. (4认同)

Jus*_*ave 28

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

UPDATE table_name
   SET new_pk_column = sequence_name.nextval;
Run Code Online (Sandbox Code Playgroud)

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

ALTER TABLE table_name
  ADD CONSTRAINT pk_table_name PRIMARY KEY( new_pk_column )
Run Code Online (Sandbox Code Playgroud)

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

CREATE TRIGGER trigger_name
  BEFORE INSERT ON table_name
  FOR EACH ROW
BEGIN
  :new.new_pk_column := sequence_name.nextval;
END;
Run Code Online (Sandbox Code Playgroud)

如果您使用的是较旧版本的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;
Run Code Online (Sandbox Code Playgroud)


小智 17

来自Oracle OTN论坛的讨论

使用alter table添加列,例如:

alter table tableName add(columnName NUMBER);
Run Code Online (Sandbox Code Playgroud)

然后创建一个序列:

CREATE SEQUENCE SEQ_ID
START WITH 1
INCREMENT BY 1
MAXVALUE 99999999
MINVALUE 1
NOCYCLE;
Run Code Online (Sandbox Code Playgroud)

并且,用于update在列中插入值,如下所示

UPDATE tableName SET columnName = seq_test_id.NEXTVAL
Run Code Online (Sandbox Code Playgroud)


小智 5

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

步骤1. - 创建关系图

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

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

步骤2. - 编辑PK列属性

获取PK列的属性.您可以双击列的名称或单击"属性"按钮.

出现"列属性"对话框.

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

第3步 - 附加信息

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

  • 从...开始
  • 增加量
  • 最低价值
  • 最大价值
  • 周期
  • 禁用缓存
  • 订购
  • 序列名称
  • 触发器名称
  • 生成触发器

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

单击"确定"(应用)到"列属性"对话框.

单击"确定(应用)"到"表属性"对话框.

表出现在关系图中.