oracle - 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 在这里进行的最佳方式是什么?
解决方案
您手动插入的标识值(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
推荐阅读
- python - Python-Docx:如何识别段落是否斜体
- javascript - Javascript 不接受 JSON 数据作为变量
- python - 如何从这些数据创建点图(不是散点图)?
- javascript - Javascript 在我的 htm 引导程序中不起作用
- task - 在不阻塞正在进行的代码的情况下在 TCL 中获得某种时间表的方法
- javascript - FasiAPI comm : 在 js 中获取 python 回调并从 FastAPI 访问 javascript
- arrays - 计算二维数组中不同元素的出现次数
- python - 如何使用 Cloud Pubsub 发送电子邮件通知
- javascript - 如何获取在javascript中具有共同价值的对象键?
- android - ReactNative:如何在 pubnub 通知 android 中自定义声音?