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

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

我有一个使用较新的

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

sql oracle primary-key identity-column
2个回答
0
投票

使用以下方法重置生成的 ID 序列:

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

见修改后的fiddle.


0
投票

简短的答案是:

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.

© www.soinside.com 2019 - 2024. All rights reserved.