我有一个使用较新的
GENERATED BY DEFAULT AS IDENTITY
功能的主键序列表:
CREATE TABLE test (
id INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
data VARCHAR
);
然后我给表格一些值开始,覆盖序列:
INSERT INTO test(id,data) VALUES (3,'something');
INSERT INTO test(id,data) VALUES (6,'something else');
现在如果我再添加几个值,让序列做它的事情:
INSERT INTO test(data) VALUES ('whatever');
INSERT INTO test(data) VALUES ('stuff');
INSERT INTO test(data) VALUES ('etc');
……我得到一个错误:
ORA-00001:违反唯一约束(FIDDLE_CEYTNFUWNIDRFXSPTDWJ.SYS_C0054804)
OK,我理解错误:显然序列从头开始并开始与现有值重叠。
如何在初始
INSERT
之后正确设置顺序?
我有一个小提琴:https://dbfiddle.uk/MtPocwBq
简短的答案是:
ALTER TABLE test MODIFY ID GENERATED BY DEFAULT AS IDENTITY (START WITH LIMIT VALUE);
Oracle 中的描述文档:
START WITH LIMIT VALUE,这是identity_options特有的,可以 只能与 ALTER TABLE MODIFY 一起使用。如果您指定 START WITH LIMIT VALUE,然后 Oracle 数据库锁定表并找到最大值 表中的标识列值(用于递增序列)或 最小标识列值(用于递减序列)并分配 该值作为序列生成器的高水位线。下一个值 序列生成器返回的是高水位标记 + 增加序列的整数增量,或高水位线 - 递减序列的整数增量。
还有你修改过的 dbfiddle.