Автоматизация стандартных процедур
Команда создания таблицы shipments с автоматически увеличивающимся значением по умолчанию и ограничением первичного ключа выглядит так:
CREATE TABLE shipments (id integer DEFAULT nextval ('shipments_shipjd_seq') PRIMARY KEY .customerjd integer, isbn text .ship_date timestamp)
В качестве значения по умолчанию для поля id назначается результат вызова nextval () для последовательности shipments_ship_id_seq. Таким образом, при вставке записей без указания поля id значение автоматически генерируется по результату вызова функции.
Внимание
Простая установка ограничения DEFAULT не гарантирует его применения. Пользователь способен вручную задать любое значение, что может привести к потенциальному нарушению уникальности в будущем. Для предотвращения конфликтов можно воспользоваться триггером. За дополнительной информацией обращайтесь к подразделу "Триггеры" этого раздела.
После вызова функции nextval () для последовательности в некотором сеансе (то есть подключении к PostgreSQL) функция currval () возвращает значение, полученное при предыдущем вызове nextval () в активном сеансе.
Примечание
Текущее значение последовательностей ассоциируется с определенным сеансом, чтобы одновременные обращения со стороны нескольких пользователей не приводило к ошибкам. Два пользователя могут работать с одной последовательностью в разных сеансах, но при этом функция currval () возвращает последнее текущее значение последовательности для того сеанса, в котором она была вызвана.
В листинге 7.31 в таблицу shipments вставляется новая запись, в которой не указано значение поля id. В этой ситуации используется значение по умолчанию, которое (см. табл. 7.2) определяется результатом приращения последовательности shipments_ship_id_seq функцией nextval().
Затем функция currva() используется для выборки только что вставленной записи.
Листинг 7.31. Функция currval().
booktown=# INSERT INTO shipments (customer_id, isbn, ship_date) booktown-# VALUES (221. '0394800753', 'now'); INSERT 3628625 1 booktown=# SELECT * FROM shipments booktown-# WHERE Id = currval('shipments_ship_id_seq'): id | customerjd | Isbn | ship_date 1002! 107 | 0394800753 | 2001-09-22 11:23:28-07 (1 row)
Наконец, функция setval () присваивает атрибуту last_value последовательности произвольное число из интервала допустимых значений. Первый аргумент функции содержит имя последовательности, заключенное в апострофы, а второй аргумент содержит целочисленную константу, представляющую новое значение last_value.
Существует два варианта вызова функции setval (). По умолчанию предполагается, что новое значение относится к инициализированной последовательности; это означает, что следующее значение, возвращенное nextval (), уже будет увеличено по отношению к величине, переданной при вызове setval ().
Кроме того, последовательность можно деинициализировать, для чего в необязательном последнем аргументе передается логическая величина false. Последовательность изменяется так, что следующий вызов nextval () вернет то же число, которое было передано при вызове setval () (хотя при следующем вызове nextval () последовательность увеличится).