向oracle中的现有表添加自动递增主键

向oracle中的现有表添加自动递增主键,oracle,Oracle,我想将一个新的自动递增主列添加到包含数据的现有表中。我该怎么做 我首先添加了一个列,然后尝试添加一个序列。之后,我丢失了如何插入该列并将其作为主键。如果您有该列和序列,则首先需要为所有现有行填充一个新键。假设您不关心将哪个键分配给哪一行 UPDATE table_name SET new_pk_column = sequence_name.nextval; 完成后,您可以创建主键约束(这假设没有现有主键约束,或者您已经删除了现有主键约束) 如果要自动生成密钥,则需要添加触发器 CREAT

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


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

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

UPDATE table_name
   SET new_pk_column = sequence_name.nextval;
完成后,您可以创建主键约束(这假设没有现有主键约束,或者您已经删除了现有主键约束)

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

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步-创建关系图

您可以先创建一个逻辑图,然后由工程师创建关系图,也可以直接创建关系图

添加需要具有自动递增PK的实体(表),选择PK的类型作为整数

第2步-编辑主键列属性

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

“列属性”对话框出现

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

第3步-其他信息

通过选择“自动增量”选项卡,可以指定与自动增量相关的其他信息

  • 增加
  • 最小值
  • 最大值
  • 循环
  • 禁用缓存
  • 命令
  • 序列名
  • 触发器名称
  • 生成触发器
通常最好提及序列名,这样它在PL/SQL中会很有用

单击列属性对话框中的确定(应用)

单击“表属性”对话框中的“确定”(应用)


表出现在关系图中。

我已经完成了上面的代码,工作正常。但列id值已更改,因为上次插入的列得到了最后一列id。但如果我们的一些同事在表中插入数据,他们将从插入主键列值开始,那么它将显示错误。有没有办法更改列id.@mallikarjun-我很难理解你在问什么。到底有人在干什么?错误到底是什么?我可以更改新主目录的列ID吗KEY@mallikarjun“列id”是什么意思?你到底想改变什么?您正在尝试更改表中列的顺序吗?10GR2需要第二个触发器查询(SELECT INTO)我可以更改新列的列id吗?您的意思是希望列成为表中的第一列而不是表的结尾吗?如果是这样,除了删除和重新创建表之外,在oracle中,答案是否定的。通常,列的顺序是不相关的。如果您要求列的顺序是特定的,我建议您创建一个表视图,其中列的顺序是您想要的。是的,确切地说,我想将此pk添加为行id 1是的,就像我前面所说的,您在oracle中的选项是删除并重新创建表(重命名表,以正确的顺序创建新表,重新插入新表)…或者只是创建一个视图,按照您想要的顺序从表中进行选择。我可以更改新列的列id吗?是的,这正是
:new.id
正在做的事情无需在11g中选择,您可以将序列值直接分配给
:new.id
。必须从Hermit的答案中获取序列。令人震惊的是,这个问题已被浏览近27000次,但只有16次投票。