向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次投票。