Oracle SQL | автоматически увеличиваемый идентификатор не увеличивается при предоставлении идентификатора

#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