Генерирование последовательных значений - обычная проблема при разработке прикладных программ для баз данных. Наилучшее решение этой проблемы - использовании объектов последовательности и выражений последовательности на языке SQL. Каждый объект последовательности - это объект базы данных с уникальным именем, к которому можно обращаться только с помощью выражений последовательности. Существует два выражения последовательности: выражение PREVVAL и выражение NEXTVAL. Выражение PREVVAL возвращает последнее из сгенерированных для предыдущего оператора значений заданной последовательности. Выражение NEXTVAL увеличивает значение объекта последовательности и возвращает его новое значение.
Чтобы создать объект последовательности, выполните оператор CREATE SEQUENCE. Например, чтобы создать объект последовательности под названием id_values с атрибутами по умолчанию, используйте следующий оператор:
CREATE SEQUENCE id_values
Чтобы вывести текущее значение этого объекта последовательности, выполните оператор VALUES с выражением PREVVAL:
VALUES PREVVAL FOR id_values 1 ----------- 1 1 record(s) selected.
Текущее значение объекта последовательности можно получать несколько раз, причем возвращаемое значение не изменится, пока не будет выполнено выражение NEXTVAL. В следующем примере выражение PREVVAL возвращает значение 1 до тех пор, пока выражение NEXTVAL не увеличит значение объекта последовательности:
VALUES PREVVAL FOR id_values 1 ----------- 1 1 record(s) selected. VALUES PREVVAL FOR id_values 1 ----------- 1 1 record(s) selected. VALUES NEXTVAL FOR id_values 1 ----------- 2 1 record(s) selected. VALUES PREVVAL FOR id_values 1 ----------- 2 1 record(s) selected.
Чтобы изменить значение столбца на следующее значение объекта последовательности, включите выражение NEXTVAL в оператор UPDATE, как показано ниже:
UPDATE staff SET id = NEXTVAL FOR id_values WHERE id = 350
Чтобы вставить новую строку в таблицу, используя следующее значение объекта последовательности, включите выражение NEXTVAL в оператор INSERT, как показано ниже:
INSERT INTO staff (id, name, dept, job) VALUES (NEXTVAL FOR id_values, 'Kandil', 51, 'Mgr')
Дополнительную информацию о выражениях PREVVAL и NEXTVAL смотрите в справочнике SQL Reference.
Поведение объектов последовательности можно настроить в соответствии с потребностями вашей прикладной программы. Атрибуты объекта последовательности изменяют операторы CREATE SEQUENCE (создание нового объекта последовательности) и ALTER SEQUENCE (изменение существующего объекта последовательности). Ниже приводятся некоторые из доступных вам атрибутов объекта последовательности:
Например, чтобы создать объект последовательности под названием id_values, с начальным значением 0, максимальным значением 1000, увеличением значения на 2 с каждым выражением NEXTVAL и возвращением к начальному значению по достижении максимального, используйте оператор:
CREATE SEQUENCE id_values START WITH 0 INCREMENT BY 2 MAXVALUE 1000 CYCLE
Дополнительную информацию об операторах CREATE SEQUENCE и ALTER SEQUENCE смотрите в справочнике SQL Reference.
Как и для столбцов идентификации, использование объектов последовательности для генерирования значений в целом улучшает производительность ваших прикладных программ в сравнении с другими подходами. Вместо объектов последовательности можно было бы создать таблицу с одним столбцом, где хранится текущее значение, и увеличивать это значение при помощи триггера или под управлением прикладной программы. В распределенной среде, где программы одновременно обращаются к одностолбцовой таблице, блокировка, необходимая для принудительного последовательного доступа к этой таблице, может серьезно повлиять на производительности.
Объекты последовательности позволяют избежать проблем с блокировкой, связанных с использованием одностолбцовой таблицы; можно кэшировать значения в памяти, что улучшает время ответа DB2. Чтобы максимизировать производительность прикладных программ, использующих объекты последовательности, убедитесь, что ваш объект последовательности кэширует достаточное количество значений. Условие CACHE операторов CREATE SEQUENCE и ALTER SEQUENCE задает максимальное количество значений последовательности, которые DB2 генерирует и хранит в памяти.
Если ваш объект последовательности должен генерировать упорядоченные значения без разрывов между ними в случае системной ошибки или деактивации базы данных, задайте в операторе CREATE SEQUENCE условия ORDER и NO CACHE. Условие NO CACHE гарантирует отсутствие разрывов между сгенерированными значениями за счет некоторого снижения производительности ваших программ, так как при этом объект последовательности записывает в журнал базы данных информацию о каждом новом сгенерированном значении.
Хотя у объектов последовательностей и столбцов идентификации при работе с прикладными программами DB2 имеют сходное назначение, между ними есть ряд существенных различий: