Это действительно плохая идея для многопользовательской среды, поскольку она будет сериализовать вставки в таблицу.Обычный подход заключается в использовании последовательности Oracle:
create sequence transaction_seq;
create trigger transaction_bir before insert on transaction
for each row
begin
:new.id := transaction_seq.nextval;
end;
Чтобы написать решение на основе триггера, которое на самом деле получило максимальное значение тока плюс 1, вам необходимо написать сложное решение с 3-триггерами, чтобы избежать "мутирующий стол "вопрос.Или вы можете создать более простое решение, используя другую таблицу для хранения текущего максимального значения, например:
create table transaction_max (current_max_id number);
insert into transaction_max values (0);
create trigger transaction_bir before insert on transaction
for each row
declare
l_current_max_id number;
begin
update transaction_max set current_max_id = current_max_id + 1
returning current_max_id into l_current_max_id;
:new.id := l_current_max_id;
end;
Это позволит избежать проблемы с изменяющейся таблицей и будет сериализовать (замедлять) вставки, поэтому я не вижулюбое преимущество по сравнению с использованием последовательности.