Oracle 12c: 在表中插入身份列

问题描述 投票:2回答:1

我有一个表,表中有一列类型为身份列,也是主键。

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: Unique Constraint (UWE.IDENTITY_DEMO_PK) verletztwhat's the best way to proceed here?

insert oracle12c identity
1个回答
1
投票

首先,貌似有一个部分是 , CONSTRAINT IDENTITY_DEMO_PK PRIMARY KEY (id)

添加到表创建DDL的最后。

只要删除 BY DEFAULT ON NULL 部分,以便将身份生成的管理留给DBMS,同时保持身份的一致性。ID 列为 PRIMARY KEY. 在这种情况下,你应该删除 ID 从插入语句中的列列表中取出列,如在

INSERT INTO identity_demo (description) VALUES ('G'); :

SQL> CREATE  TABLE identity_demo  (
  2      id          NUMBER GENERATED AS IDENTITY,
  3      description VARCHAR2(100) NOT NULL,
  4      CONSTRAINT IDENTITY_DEMO_PK PRIMARY KEY (id)
  5    );

Table created

SQL> BEGIN
  2    INSERT INTO identity_demo (id, description) VALUES (1,'A');
  3    INSERT INTO identity_demo (id, description) VALUES (2,'B');
  4    INSERT INTO identity_demo (id, description) VALUES (3,'C');
  5    INSERT INTO identity_demo (id, description) VALUES (4,'D');
  6    INSERT INTO identity_demo (id, description) VALUES (5,'E');
  7    INSERT INTO identity_demo (id, description) VALUES (6,'F');
  8  END;
  9  /

ORA-32795: cannot insert into a generated always identity column
ORA-06512: at line 3

SQL> INSERT INTO identity_demo (description) VALUES ('G');

1 row inserted

SQL> SELECT * FROM identity_demo;

        ID DESCRIPTION
---------- -------------------------------------------------------
         1 G

SQL> BEGIN
  2    INSERT INTO identity_demo (description) VALUES ('A');
  3    INSERT INTO identity_demo (description) VALUES ('B');
  4    INSERT INTO identity_demo (description) VALUES ('C');
  5    INSERT INTO identity_demo (description) VALUES ('D');
  6    INSERT INTO identity_demo (description) VALUES ('E');
  7    INSERT INTO identity_demo (description) VALUES ('F');
  8  END;
  9  /

PL/SQL procedure successfully completed

SQL> SELECT * FROM identity_demo;

        ID DESCRIPTION
---------- --------------------------------------------------------
         1 G
         2 A
         3 B
         4 C
         5 D
         6 E
         7 F

7 rows selected

0
投票

你手动插入的标识值(1-6)和序列生成器生成的标识值之间发生了冲突。您可以通过调整序列发生器来解决这个问题。

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

你可以通过调整序列发生器来解决这个问题: START WITH LIMIT VALUE 锁定表,找到最高的id,并将内部序列生成器设置为下一个更高的值。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
© www.soinside.com 2019 - 2024. All rights reserved.