#sql #oracle #identity-column
#sql #Oracle #идентификатор-столбец
Вопрос:
У меня есть следующий увеличивающийся идентификатор:
create table PATIENT (
PATIENTID INTEGER
generated by default on null as identity ( start with 1 nocycle order) not null
);
Я заметил, что, когда я указываю идентификатор (например, при моих первых вставках), идентификатор в созданной последовательности не увеличивается.
В результате, если я добавляю пациента с идентификатором 1, а затем с идентификатором NULL, я получаю сообщение об ошибке.
Есть ли способ избежать этого? Или мне нужно удалить все идентификаторы из моих скриптов вставки?
Комментарии:
1. не указывайте значение. в этом и заключается цель последовательности. Вы не можете сделать и то, и другое. Вставка будет использовать все, что вы передаете, и ничего не делает с последовательностью в этот момент.
Ответ №1:
Если вы укажете (ненулевое) значение для столбца идентификатора, последовательность останется с тем же значением. Это означает, что идентификатор может попытаться вставить значение, которое вы указали вручную.
Есть несколько путей, которые вы могли бы использовать здесь
Никогда не указывайте значения для столбца идентификатора. Установите его как 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
Разрешить сценариям предоставлять значения, но сбросить последовательность идентификаторов до столбцов maxvalue сразу после использования 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