Поведение триггера вставки при определении автоинкремента в Oracle - PullRequest
1 голос
/ 07 июня 2010

Я искал способ определения типа данных автоинкремента в Oracle и нашел следующие вопросы по переполнению стека:

  1. Автоинкремент в Oracle
  2. Первичный ключ автоинкремента в базе данных Oracle

Способ использования автоинкрементных типов заключается в определении последовательности и триггера, чтобы сделать вставку прозрачной, где триггер вставки выглядит так:

create trigger mytable_trg  
before insert on mytable  
for each row  
when (new.id is null)  
begin  
    select myseq.nextval into :new.id from dual;  
end;

У меня есть некоторые сомнения относительно поведения этого триггера:

  1. Что делает этот триггер, если предоставленное значение «id» отличается от NULL?
  2. Что означает двоеточие перед "новым"?

Я хочу, чтобы триггер вставлял новую строку со следующим значением последовательности в качестве идентификатора, каким бы ни было предоставленное значение «new.id». Я полагаю, что оператор WHEN создает триггер для вставки новой строки, только если предоставленный идентификатор равен NULL (в противном случае он не будет вставлен или завершится ошибкой).

Могу ли я просто удалить инструкцию WHEN, чтобы триггер всегда вставлял, используя следующее значение последовательности?

Ответы [ 3 ]

2 голосов
/ 07 июня 2010

Условие WHEN указывает условие, которое должно быть ИСТИНА, чтобы сработал триггер. В этом примере триггер сработает только в том случае, если новая строка имеет значение NULL IS. Если идентификатор не нулевой, триггер не сработает, и поэтому любой идентификатор значения, указанный в операторе вставки, останется один.

Да, если вы просто удалите условие WHEN, триггер всегда будет срабатывать и всегда будет предоставлять значение последовательности для идентификатора.

1 голос
/ 07 июня 2010

У вас есть 2 способа, которые вы можете сделать:

если таблица выглядит так:

create table my_test (
id number, 
my_test data varchar2(255)
); 

и ваша последовательность такова:

create sequence test_seq 
start with 1 
increment by 1 
nomaxvalue;  

вы можете создать триггер, подобный этому (без оператора When, как сказал Тони Эндрюс)

create trigger test_trigger
before insert on my_test
for each row
begin
select test_seq.nextval into :new.id from dual;
end; 

или вы можете просто использовать это, тогда вам не нужен триггер:

insert into my_test values(test_seq.nextval, 'voila!'); 
1 голос
/ 07 июня 2010
  1. Ничего. Это позволяет указать значение вручную.
  2. Это заполнитель для нового значения столбца.
...