向oracle中的现有表添加自动递增主键
我想将一个新的自动递增主列添加到包含数据的现有表中。我该怎么做向oracle中的现有表添加自动递增主键,oracle,Oracle,我想将一个新的自动递增主列添加到包含数据的现有表中。我该怎么做 我首先添加了一个列,然后尝试添加一个序列。之后,我丢失了如何插入该列并将其作为主键。如果您有该列和序列,则首先需要为所有现有行填充一个新键。假设您不关心将哪个键分配给哪一行 UPDATE table_name SET new_pk_column = sequence_name.nextval; 完成后,您可以创建主键约束。这假定没有现有主键约束,或者您已经删除了现有主键约束 ALTER TABLE table_name
我首先添加了一个列,然后尝试添加一个序列。之后,我丢失了如何插入该列并将其作为主键。如果您有该列和序列,则首先需要为所有现有行填充一个新键。假设您不关心将哪个键分配给哪一行
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;
create sequence t1_seq start with 1 increment by 1 nomaxvalue;
并且,使用update在如下列中插入值
UPDATE tableName SET columnName = seq_test_id.NEXTVAL
假设您的表名为t1,主键名为id
首先,创建序列:
CREATE SEQUENCE SEQ_ID
START WITH 1
INCREMENT BY 1
MAXVALUE 99999999
MINVALUE 1
NOCYCLE;
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;
您可以使用Oracle Data Modeler创建自动递增的代理项键
第1步-创建关系图
您可以先创建一个逻辑图,然后由工程师创建关系图,也可以直接创建关系图
添加需要具有自动递增主键的实体表,选择主键类型为整数
第2步-编辑PK列属性
获取PK列的属性。
您可以双击列的名称或单击“属性”按钮
“列属性”对话框出现
第一次选择“常规”选项卡“默认选择”。
然后选中“自动增量”和“标识列”复选框
第3步-补充资料
通过选择“自动增量”选项卡,可以指定与自动增量相关的其他信息
从
增加
最小值
最大值
周期
禁用缓存
顺序
序列名
触发器名称
生成触发器
通常最好提及序列名,这样它在PL/SQL中会很有用
单击“确定”应用于“列属性”对话框
单击“确定”应用于“表属性”对话框
表出现在关系图中。我已经完成了上面的代码,工作正常。但列id值已更改,因为上次插入的列得到了最后一列id。但如果我们的一些同事在表中插入数据,他们将从插入主键列值开始,那么它将显示错误。有没有办法更改列id.@mallikarjun-我很难理解你在问什么。到底有人在干什么?错误到底是什么?我可以更改新主目录的列ID吗KEY@mallikarjun-列id是什么意思?你到底想改变什么?您正在尝试更改表中列的顺序吗?第二个触发器查询SELECT INTO对于10GR2是必需的。我可以更改新列的列id吗?您的意思是希望该列成为表中的第一列而不是表的结尾吗?无论如何,如果是这样,除了删除和重新创建表之外,在oracle中,答案是否定的。通常,列的顺序是不相关的。如果您要求列的顺序是特定的,我建议您创建一个表视图,其中列的顺序是您想要的。是的,确切地说,我想将此pk添加为行id 1是的,正如我前面所说,您在oracle中的选项是删除并重新创建表重命名表,以正确的顺序创建新表,重新插入到新表…或只是创建一个视图,按照您想要的顺序从表中进行选择。我可以更改新列的列id吗?是的,这正是:new.id正在做的事情无需在11g中选择,您可以直接将序列值分配给:new.id.必须从Hermit的答案中获取序列。令人震惊的是,这个问题已被浏览了近27000次,但只有16次投票。