Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Справочник по SQL http.doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
671.74 Кб
Скачать

Обеспечение уникальности первичного ключа

В некоторых СУБД как 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)

);

-- вставляем данных для Oracle

insert into tblseq values(seq.nextval,3.14);

insert into tblseq values(seq.nextval,6.14);

insert into tblseq values(seq.nextval,7.14);

commit;

-- вставляем данные для PostgreSQL

insert 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 написать тригер.

-- для PostgreSQL

create table tblseq(

id integer not null DEFAULT nextval('seq'),

num double precision,

constraint pk_tblseq primary key (id)

);

-- для Oracle, создаем тригер tblseq_autoid

create or replace trigger tblseq_autoid

before insert on tblseq

for each row

declare

begin

select seq.nextval into :new.id from dual;

end tblseq_autoid;

-- теперь значение id будет устанавливаться

-- автоматически следующим значением

-- последовательности seq

insert into tblseq(num) values(3.14);

insert into tblseq(num) values(6.14);

insert into tblseq(num) values(7.14);

commit;

Столбцы с автоинкрементом

Как в MS Access введен специальный тип idenity или counter, так в MySQL и PostgreSQL можно использовать тип serial для автоматического создания последовательности связанной со столбцом таблицы. В MySQL также можно воспользоваться атрибутом столбца AUTO_INCREMENT в определении таблицы. Фактически, тип serial эквивалент определения BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE. В PostgreSQL для последовательности типа serial используется целое в 4 байта (serial4). Если это кажется малым, можно воспользоваться типом serial8.

-- для MySQL

CREATE TABLE tblname (

id integer unsigned AUTO_INCREMENT,

...

-- для MySQL и PostgreSQL

create table tblseq(

id serial,

num double precision,

constraint pk_tblseq primary key (id)

);

-- значение id будет устанавливаться автоматически

-- следующим значением

insert into tblseq(num) values(3.14);

insert into tblseq(num) values(6.14);

insert into tblseq(num) values(7.14);

commit;

При разработке клиентских программ необходимо знать значение первичного ключа последней вставленной записи для позиционирования на нее. В PostgreSQL для этого есть функция lastval(), возвращающая самое последнее сгенерированное значение для какой-либо последовательности (не важно созданной через SEQUENCE, или через тип serial) в текущей сессии. В MySQL аналогичная функция называетсяLAST_INSERT_ID().