В некоторых СУБД как Oracle и PostgreSQL для обеспечения уникальности первичного ключа можно воспользоваться объектом последовательность, генерирующий последовательность целых чисел. По умолчанию 1027 максимальное значение для восходящей последовательности в Oracle и 1063 в PostgreSQL. Так что одной последовательности вполне хватит на несколько таблиц. В Oracle последовательность имеет два псевдостолбца:
· CURRVAL - текущее значение последовательности;
· NEXTVAL - увеличивает текущее значение на 1, а затем возвращает его.
В PostgreSQL для этой цели используются одноименные функции. Кроме этого есть функция setval, позволяющая задать текущее значение последовательности. Это можно использовать, например, при нумерации записей в выборке.
-- создаем последовательность-- с параметрами по умолчаниюCREATE SEQUENCE seq; -- создаем тестовую таблицуcreate table tblseq(id integer not null,num double precision, constraint pk_tblseq primary key (id)); -- вставляем данных для Oracleinsert into tblseq values(seq.nextval,3.14);insert into tblseq values(seq.nextval,6.14);insert into tblseq values(seq.nextval,7.14);commit; -- вставляем данные для PostgreSQLinsert into tblseq values(nextval('seq'),3.14);insert into tblseq values(nextval('seq'),6.14);insert into tblseq values(nextval('seq'),7.14);commit; -- проверяем select * from tblseq; -- уничтожение последовательностиDROP SEQUENCE seq;
Чтобы сделать присваивание значения первичного ключа автоматическим, в PostgreSQL надо подкорректировать значение столбца по умолчанию в определении таблицы, а для Oracle написать тригер.
-- для PostgreSQLcreate table tblseq(id integer not null DEFAULT nextval('seq'),num double precision, constraint pk_tblseq primary key (id)); -- для Oracle, создаем тригер tblseq_autoidcreate or replace trigger tblseq_autoid before insert on tblseq for each rowdeclarebegin select seq.nextval into :new.id from dual;end tblseq_autoid; -- теперь значение id будет устанавливаться-- автоматически следующим значением -- последовательности seqinsert into tblseq(num) values(3.14);insert into tblseq(num) values(6.14);insert into tblseq(num) values(7.14);commit;