CREATE SEQUENCE: примеры (SQL)

Создание последовательностей в MS SQL с помощью CREATE SEQUENCE
Раздел: Функции для работы с последовательностями, DDL
CREATE_SEQUENCE(sequence_name ): N/A

Описание функции CREATE SEQUENCE

Функция CREATE SEQUENCE в MS SQL Server предназначена для создания объекта последовательности, который генерирует последовательность числовых значений согласно заданным параметрам. Последовательности применяются для получения уникальных значений, часто в качестве суррогатных ключей.

Использование последовательностей актуально в сценариях, требующих гарантированной уникальности числовых значений в пределах базы данных, независимо от транзакций или откатов. Объект последовательности существует вне отдельных таблиц, что позволяет использовать одну последовательность для нескольких таблиц.

Синтаксис функции включает несколько аргументов:

  • sequence_name - уникальное имя последовательности в рамках схемы.
  • [ AS ] data_type - тип данных последовательности. Допустимые типы: tinyint, smallint, int, bigint, decimal, numeric. По умолчанию используется bigint.
  • START WITH - начальное значение последовательности. Значение должно быть в диапазоне минимального и максимального значений. По умолчанию равно минимальному значению для возрастающей и максимальному для убывающей последовательности.
  • INCREMENT BY - шаг приращения последовательности. Положительное значение создает возрастающую последовательность, отрицательное - убывающую. Не может быть равным 0. По умолчанию равен 1.
  • { MINVALUE [ value ] } | { NO MINVALUE } - минимальное значение последовательности. Для типов decimal и numeric по умолчанию устанавливается минимальное значение типа. Для других типов NO MINVALUE эквивалентно минимальному значению типа.
  • { MAXVALUE [ value ] } | { NO MAXVALUE } - максимальное значение последовательности. Аналогично MINVALUE, по умолчанию зависит от типа данных.
  • { CYCLE | NO CYCLE } - определяет, будет ли последовательность перезапускаться после достижения предела. При CYCLE после достижения MAXVALUE для возрастающей последовательности начинается с MINVALUE. По умолчанию установлено NO CYCLE.
  • { CACHE [ size ] | NO CACHE } - указывает, сколько значений последовательности кэшируется в памяти для повышения производительности. По умолчанию SQL Server кэширует 50 значений.

Функция не возвращает значения. Результатом выполнения является создание объекта последовательности в базе данных.

Примеры использования CREATE SEQUENCE

Пример создания простой последовательности с параметрами по умолчанию:

CREATE SEQUENCE SimpleSequence;
Последовательность создана с типом bigint, START WITH = 1, INCREMENT BY = 1.

Пример последовательности с явным указанием параметров:

CREATE SEQUENCE OrderSequence
AS int
START WITH 1000
INCREMENT BY 5
MINVALUE 1000
MAXVALUE 9999
NO CYCLE
CACHE 10;
Последовательность создана с начальным значением 1000 и шагом 5.

Пример убывающей последовательности:

CREATE SEQUENCE DescSequence
START WITH 50
INCREMENT BY -1
MINVALUE 0
MAXVALUE 50
CYCLE
NO CACHE;
Последовательность создана с убыванием от 50 до 0 с последующим циклом.

Похожие функции в MS SQL

В MS SQL Server альтернативой CREATE SEQUENCE может служить использование IDENTITY свойства для столбцов таблицы. IDENTITY автоматически генерирует значения для столбца, но привязан к конкретной таблице. Последовательности более гибки, так как не зависят от таблиц.

Еще одна альтернатива - использование NEWID() или NEWSEQUENTIALID() для генерации уникальных идентификаторов GUID. Эти функции генерируют строковые значения, в отличие от числовых последовательностей.

Предпочтительнее использовать CREATE SEQUENCE, когда требуется общая последовательность для нескольких таблиц или более сложные правила генерации, такие как цикличность или контроль кэширования.

Аналоги в других СУБД

В Oracle используется аналогичная команда CREATE SEQUENCE с похожим синтаксисом. Отличия включают дополнительные параметры, такие как ORDER и NOCACHE, а также возможность использования последовательностей через NEXTVAL и CURRVAL.

CREATE SEQUENCE oracle_seq START WITH 1 INCREMENT BY 1 NOCACHE;

В PostgreSQL также существует CREATE SEQUENCE. Отличие состоит в том, что PostgreSQL автоматически создает последовательности для SERIAL столбцов.

CREATE SEQUENCE postgres_seq START 1 INCREMENT 1;

В MySQL отсутствует объект последовательности. Вместо этого используется AUTO_INCREMENT для столбцов таблицы, аналогично IDENTITY в SQL Server.

CREATE TABLE table1 (id INT AUTO_INCREMENT PRIMARY KEY);

В SQLite для автоинкремента используется ключевое слово AUTOINCREMENT, но оно работает только для целочисленного первичного ключа.

CREATE TABLE table1 (id INTEGER PRIMARY KEY AUTOINCREMENT);

Типичные ошибки

Ошибка при попытке создать последовательность с неправильным типом данных:

CREATE SEQUENCE ErrorSequence AS varchar(10);
Msg 402, Level 16, State 1, Line 1
Неправильный тип данных для параметра data_type.

Ошибка при указании START вне диапазона MINVALUE и MAXVALUE:

CREATE SEQUENCE RangeSequence
START WITH 20
MINVALUE 10
MAXVALUE 15;
Msg 11728, Level 16, State 1, Line 1
Начальное значение 20 выходит за пределы минимального и максимального значений.

Ошибка при попытке использовать последовательность, которая достигла предела и не имеет цикла:

CREATE SEQUENCE NoCycleSeq
START WITH 5
INCREMENT BY 1
MAXVALUE 5
NO CYCLE;
SELECT NEXT VALUE FOR NoCycleSeq; -- Выполнится
SELECT NEXT VALUE FOR NoCycleSeq; -- Ошибка
Msg 11728, Level 16, State 1, Line 5
Исчерпан предел для объекта последовательности.

Изменения в последних версиях

В SQL Server 2012 функция CREATE SEQUENCE была введена как новая функциональность. В последующих версиях существенных изменений не было. Однако в SQL Server 2017 улучшена производительность при использовании кэширования последовательностей.

В SQL Server 2019 добавлены улучшения в обработке последовательностей в сценариях с высокой параллельностью, что уменьшает блокировки при генерации значений.

Расширенные примеры

Создание последовательности для использования в нескольких таблицах:

Пример sql
CREATE SEQUENCE MultiTableSeq AS int START WITH 1 INCREMENT BY 1;

CREATE TABLE Table1 (ID int DEFAULT (NEXT VALUE FOR MultiTableSeq), Name varchar(50));
CREATE TABLE Table2 (ID int DEFAULT (NEXT VALUE FOR MultiTableSeq), Description varchar(50));

INSERT INTO Table1 (Name) VALUES ('Record1');
INSERT INTO Table2 (Description) VALUES ('Record2');
SELECT * FROM Table1;
SELECT * FROM Table2;
ID  Name
1 Record1

ID Description
2 Record2

Использование последовательности в комбинации с OVER для нумерации строк:

Пример sql
CREATE SEQUENCE RowNumberSeq AS int START WITH 1 INCREMENT BY 1;

SELECT NEXT VALUE FOR RowNumberSeq OVER (ORDER BY Name) as RowNum, Name
FROM (VALUES ('Ivan'), ('Anna'), ('Petr')) AS Users(Name);
RowNum  Name
1 Anna
2 Ivan
3 Petr

Сброс последовательности с помощью ALTER SEQUENCE:

Пример sql
CREATE SEQUENCE ResetSeq START WITH 1;
SELECT NEXT VALUE FOR ResetSeq; -- 1
SELECT NEXT VALUE FOR ResetSeq; -- 2

ALTER SEQUENCE ResetSeq RESTART WITH 10;
SELECT NEXT VALUE FOR ResetSeq; -- 10

MS SQL CREATE_SEQUENCE function comments

En
CREATE SEQUENCE Creates a sequence object and specifies its properties