Ответ 1
Что-то вроде этого будет работать на 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;
Если вы используете более раннюю версию, вам нужно сделать SELECT INTO, чтобы получить следующее значение из последовательности
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;
Помните, что последовательности Oracle не являются свободными от пробелов. Поэтому вполне возможно, что конкретные значения будут пропущены по целому ряду причин. Ваша первая вставка может иметь идентификатор 10000, а второй может иметь идентификатор 10020, если он выполнил минуты, часы или дни позже.
Кроме того, имейте в виду, что Oracle не поддерживает указание нескольких строк в предложении VALUES, как это делает MySQL. Поэтому вместо
insert into t1 (firstname, lastname) values ('Michael','Jordan'),('Larry','Bird')
вам понадобятся два отдельных оператора INSERT
insert into t1 (firstname, lastname) values ('Michael','Jordan');
insert into t1 (firstname, lastname) values ('Larry','Bird');