【发布时间】:2012-07-12 22:40:27
【问题描述】:
我想将一个新的自动增量主列添加到现有的包含数据的表中。我该怎么做?
我首先添加了一个列,然后尝试添加一个序列,我失去了如何插入该列并将该列作为主键。
【问题讨论】:
-
令人震惊的是,这个问题已经被浏览了近 27000 次,但只有 16 次点赞。
标签: oracle
我想将一个新的自动增量主列添加到现有的包含数据的表中。我该怎么做?
我首先添加了一个列,然后尝试添加一个序列,我失去了如何插入该列并将该列作为主键。
【问题讨论】:
标签: oracle
假设您的表称为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;
【讨论】:
:new.id 正在做的事情
select into,直接给:new.id赋值即可。
如果您有列和序列,则首先需要为所有现有行填充一个新键。假设您不在乎哪个键分配给哪一行
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;
【讨论】:
使用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
【讨论】:
您可以使用 Oracle Data Modeler 创建自动递增代理键。
第 1 步 - 创建关系图
您可以先创建逻辑图和工程师来创建关系图,或者您可以直接创建关系图。
添加需要自动递增PK的实体(表),选择PK的类型为Integer。
第 2 步 - 编辑 PK 列属性
获取PK列的属性。 您可以双击列的名称或单击“属性”按钮。
出现列属性对话框。
选择常规选项卡(第一次默认选择)。 然后选中“自动增量”和“标识列”复选框。
第 3 步 - 附加信息
可以通过选择“自动增量”选项卡来指定与自动增量相关的其他信息。
提及序列名称通常是个好主意,这样它在 PL/SQL 中会很有用。
单击“确定”(应用)到“列属性”对话框。
在“表属性”对话框中单击“确定”(应用)。
表格出现在关系图中。
【讨论】: