oracle 在插入手动ID后,如何正确设置GENERATED BY DEFAULT AS IDENTITY序列?

mpgws1up  于 2023-04-20  发布在  Oracle
关注(0)|答案(2)|浏览(469)

我有一个使用较新的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

epfja78i

epfja78i1#

简短的回答是:

ALTER TABLE test MODIFY ID GENERATED BY DEFAULT AS IDENTITY (START WITH LIMIT VALUE);

Oracle文档中的说明:
特定于identity_options的START WITH LIMIT VALUE只能与ALTER TABLE MODIFY一起使用。如果指定START WITH LIMIT VALUE,则Oracle数据库锁定表并查找表中的最大标识列值(对于递增序列)或最小标识列值(对于递减序列)并将该值指定为序列生成器的高水位线。序列生成器返回的下一个值将是高水位线+INCREMENT BY整数表示递增序列,或高水位线- INCREMENT BY整数表示递减序列。
还有你修改过的dbfiddle

unftdfkk

unftdfkk2#

使用以下命令重置生成的ID序列:

alter table test modify (id generated as identity (start with 7));

参见修改的fiddle

相关问题