Coś takiego będzie działać na 11g
CREATE SEQUENCE t1_id_seq
start with 10000
increment by 1;
CREATE TRIGGER trigger_name
BEFORE INSERT ON t1
FOR EACH ROW
DECLARE
BEGIN
IF( :new.id IS NULL )
THEN
:new.id := t1_id_seq.nextval;
END IF;
END;
Jeśli korzystasz z wcześniejszej wersji, musisz wykonać SELECT INTO, aby uzyskać następną wartość z sekwencji
CREATE TRIGGER trigger_name
BEFORE INSERT ON t1
FOR EACH ROW
DECLARE
BEGIN
IF( :new.id IS NULL )
THEN
SELECT t1_id_seq.nextval
INTO :new.id
FROM dual;
END IF;
END;
Należy pamiętać, że sekwencje Oracle nie są pozbawione przerw. Jest więc całkiem możliwe, że poszczególne wartości zostaną pominięte z różnych powodów. Twoja pierwsza wstawka może mieć identyfikator 10000, a druga może mieć identyfikator 10020, jeśli zrobisz to kilka minut, godzin lub dni później.
Ponadto należy pamiętać, że Oracle nie obsługuje określania wielu wierszy w klauzuli VALUES, tak jak robi to MySQL. Więc zamiast
insert into t1 (firstname, lastname) values ('Michael','Jordan'),('Larry','Bird')
potrzebujesz dwóch oddzielnych instrukcji INSERT
insert into t1 (firstname, lastname) values ('Michael','Jordan');
insert into t1 (firstname, lastname) values ('Larry','Bird');