我有一个使用较新的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)
好的,我理解错误:显然,该序列在开始处开始并且开始与现有值重叠。
如何正确设置初始INSERT
之后的序列?
我有一个小提琴:https://dbfiddle.uk/MtPocwBq
2条答案
按热度按时间epfja78i1#
简短的回答是:
Oracle文档中的说明:
特定于identity_options的START WITH LIMIT VALUE只能与ALTER TABLE MODIFY一起使用。如果指定START WITH LIMIT VALUE,则Oracle数据库锁定表并查找表中的最大标识列值(对于递增序列)或最小标识列值(对于递减序列)并将该值指定为序列生成器的高水位线。序列生成器返回的下一个值将是高水位线+INCREMENT BY整数表示递增序列,或高水位线- INCREMENT BY整数表示递减序列。
还有你修改过的dbfiddle。
unftdfkk2#
使用以下命令重置生成的ID序列:
参见修改的fiddle。