甲骨文 SQL |提供 id 时,自动递增的 ID 不会递增
Oracle SQL | Auto incremented ID is not incremented when an id is provided
我有以下递增的 ID:
create table PATIENT (
PATIENTID INTEGER
generated by default on null as identity ( start with 1 nocycle order) not null
);
我注意到,当我提供一个 id 时(例如在我的第一次插入时),创建的序列中的 id 不会递增。
因此,如果我添加一个 ID 为 1 的患者,然后再添加一个 ID 为 NULL 的患者,我会收到错误消息。
有没有办法避免这种情况?或者我是否必须从我的插入脚本中删除所有 ID?
如果您为标识列提供(非空)值,序列将保持相同的值。这意味着身份可以尝试插入您手动提供的值。
这里有几条路径可供选择
永远不要为标识列提供值。将其设置为 generated always
以确保没有人可以这样做:
create table patient (
patientid integer
generated always as identity (
start with 1 nocycle order
) not null primary key
);
insert into patient
values ( 1 );
ORA-32795: cannot insert into a generated always identity column
允许脚本提供值,但在使用 alter table
:
后立即将标识的序列重置为列最大值
drop table patient
cascade constraints purge;
create table patient (
patientid integer
generated by default on null as identity (
start with 1 nocycle order
) not null primary key
);
insert into patient
values ( 1 );
insert into patient
values ( 11 );
commit;
insert into patient
values ( default );
ORA-00001: unique constraint (CHRIS.SYS_C0024892) violated
alter table patient
modify patientid
generated by default on null as identity (
start with limit value
);
insert into patient
values ( default );
select * from patient;
PATIENTID
1
11
12
我有以下递增的 ID:
create table PATIENT (
PATIENTID INTEGER
generated by default on null as identity ( start with 1 nocycle order) not null
);
我注意到,当我提供一个 id 时(例如在我的第一次插入时),创建的序列中的 id 不会递增。
因此,如果我添加一个 ID 为 1 的患者,然后再添加一个 ID 为 NULL 的患者,我会收到错误消息。
有没有办法避免这种情况?或者我是否必须从我的插入脚本中删除所有 ID?
如果您为标识列提供(非空)值,序列将保持相同的值。这意味着身份可以尝试插入您手动提供的值。
这里有几条路径可供选择
永远不要为标识列提供值。将其设置为 generated always
以确保没有人可以这样做:
create table patient (
patientid integer
generated always as identity (
start with 1 nocycle order
) not null primary key
);
insert into patient
values ( 1 );
ORA-32795: cannot insert into a generated always identity column
允许脚本提供值,但在使用 alter table
:
drop table patient
cascade constraints purge;
create table patient (
patientid integer
generated by default on null as identity (
start with 1 nocycle order
) not null primary key
);
insert into patient
values ( 1 );
insert into patient
values ( 11 );
commit;
insert into patient
values ( default );
ORA-00001: unique constraint (CHRIS.SYS_C0024892) violated
alter table patient
modify patientid
generated by default on null as identity (
start with limit value
);
insert into patient
values ( default );
select * from patient;
PATIENTID
1
11
12