首页 > 解决方案 > Oracle 12c:插入到带有标识列的表中

问题描述

我有一个表,其中有一列类型为标识列,这也是主键。

CREATE  TABLE identity_demo  (
    id NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY,
    description VARCHAR2(100) not null
  );

然后我插入几行数据

insert into identity_demo (id, description) values (1,'A');
insert into identity_demo (id, description) values (2,'B');
insert into identity_demo (id, description) values (3,'C');
insert into identity_demo (id, description) values (4,'D');
insert into identity_demo (id, description) values (5,'E');
insert into identity_demo (id, description) values (6,'F');

如果我现在要插入未设置值 ID 的行,则会出现键违规

insert into identity_demo (description) values ('G');

ORA-00001:唯一约束 (UWE.IDENTITY_DEMO_PK) verletzt 在这里进行的最佳方式是什么?

标签: oraclesql-insertoracle12cidentityddl

解决方案


您手动插入的标识值(1 到 6)与序列生成器生成的标识值之间存在冲突。您可以通过调整序列生成器来修复它:

ALTER TABLE identity_demo MODIFY (
  id GENERATED BY DEFAULT ON NULL AS IDENTITY (START WITH LIMIT VALUE));

锁定表,找到最高的START WITH LIMIT VALUEid 并将内部序列生成器设置为下一个更高的值7

如果您不想运行此ALTER TABLE命令,您可以分隔数字空格,例如 1...999 用于手动值,1000... 用于自动值。你必须像这样设置你的生成器:

ALTER TABLE identity_demo MODIFY (
  id GENERATED BY DEFAULT ON NULL AS IDENTITY (START WITH 1000));

INSERT INTO identity_demo (description) VALUES ('H');

...
6      F
7      G
1000   H

推荐阅读