CREATE SEQUENCE (Transact-SQL)
Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure
Создает объект последовательности и указывает его свойства. Последовательность представляет собой определяемый пользователем объект, привязанный к схеме, который формирует последовательность числовых значений в соответствии со спецификацией, с которой эта последовательность создавалась. Последовательность числовых значений формируется в возрастающем или убывающем порядке с заданным интервалом; можно настроить перезапуск (зацикливание) последовательности, когда она исчерпана. В отличие от столбцов идентификаторов последовательности не связаны с конкретными таблицами. Приложение обращается к объекту последовательности, чтобы получить следующее значение. Приложения управляют связями между последовательностями и таблицами. Пользовательские приложения могут ссылаться на объект последовательности и распределять значения между несколькими строками и таблицами.
В отличие от значений столбцов идентификаторов, которые создаются при вставке строк, приложение может получить следующий порядковый номер без вставки строки, вызвав функцию NEXT VALUE FOR. Получить несколько значений из последовательности за один раз можно с помощью функции sp_sequence_get_range .
Сведения и сценарии использования функций CREATE SEQUENCE и NEXT VALUE FOR см. в разделе Порядковые номера.
Соглашения о синтаксисе Transact-SQL
Синтаксис
CREATE SEQUENCE [schema_name . ] sequence_name
[ AS [ built_in_integer_type | user-defined_integer_type ] ]
[ START WITH <constant> ]
[ INCREMENT BY <constant> ]
[ { MINVALUE [ <constant> ] } | { NO MINVALUE } ]
[ { MAXVALUE [ <constant> ] } | { NO MAXVALUE } ]
[ CYCLE | { NO CYCLE } ]
[ { CACHE [ <constant> ] } | { NO CACHE } ]
[ ; ]
Аргументы
sequence_name
Указывает уникальное имя, под которым последовательность известна в базе данных. Тип sysname.
[ built_in_integer_type | user-defined_integer_type
Последовательность может быть определена с любым целочисленным типом. Допускаются следующие типы.
- tinyint — от 0 до 255
- smallint — от –32 768 до 32 767
- int — от –2 147 483 648 до 2 147 483 647
- bigint — от –9 223 372 036 854 775 808 до 9 223 372 036 854 775 807
- decimal или numeric с масштабом 0.
- Любой определяемый пользователем тип данных (псевдоним типа), основанный на одном из допустимых типов.
Если тип данных не указан, то по умолчанию используется тип bigint.
START WITH <constant>
Первое значение, возвращаемое объектом последовательности. Значение START должно быть не больше максимального и не меньше минимального значения объекта последовательности. По умолчанию начальным значением для нового объекта последовательности служит минимальное значение для объекта возрастающей последовательности и максимальное — для объекта убывающей.
INCREMENT BY <constant>
Значение, на которое увеличивается (или уменьшается, если оно отрицательное) значение объекта последовательности при каждом вызове функции NEXT VALUE FOR. Если значение приращения отрицательно, то объект последовательности убывает, в противном случае — возрастает. Приращение не может быть равно 0. По умолчанию для нового объекта последовательности используется приращение 1.
[ MINVALUE <constant> | NO MINVALUE ]
Указывает граничные значения для объекта последовательности. По умолчанию минимальным значением для нового объекта последовательности служит минимальное значение для типа данных объекта последовательности. Для типа данных tinyint это ноль, для всех остальных типов данных — отрицательное число.
[ MAXVALUE <constant> | NO MAXVALUE
Указывает граничные значения для объекта последовательности. По умолчанию максимальным значением для нового объекта последовательности служит максимальное значение для типа данных объекта последовательности.
[ CYCLE | NO CYCLE ]
Свойство, которое указывает, перезапускается объект последовательности с минимального значения (или максимального для объектов убывающих последовательностей) или вызывает исключение, когда достигнуто максимальное (или максимальное) значение. По умолчанию для новых объектов последовательности используется параметр цикличности NO CYCLE.
Примечание.
Циклическое повторение последовательности начинается не с начального, а с минимального или максимального значения.
[ CACHE [<constant> ] | NO CACHE ]
Повышает производительность для приложений, использующих объекты последовательностей, сводя к минимуму число операций дискового ввода-вывода, которые требуются для создания порядковых номеров. По умолчанию имеет значение CACHE.
Например, если выбран размер кэша 50, то SQL Server не кэширует 50 отдельных значений. Кэшируется только текущее значение и число значений, оставшихся в кэше. Это значит, что объем памяти для хранения кэша всегда равен размеру двух экземпляров типа данных объекта последовательности.
Примечание.
Если параметр кэширования задан без указания размера кэша, то размер выбирается компонентом Database Engine. Однако пользователям не следует полагаться на предсказуемость выбора. Корпорация Майкрософт может изменить этот метод вычисления размера кэша без предварительного уведомления.
Если создание проводилось с параметром CACHE, то непредвиденное завершение работы (например, сбой электропитания) может привести к потере порядковых номеров, оставшихся в кэше.
Общие замечания
Порядковые номера создаются вне области текущей транзакции. Они обрабатываются, когда выполняется фиксация или откат транзакции, использующей порядковый номер. Проверка на наличие повторов происходит, только если запись целиком заполнена. В некоторых случаях, когда одно число используется для создания нескольких записей, оно позже может считаться повтором. Если это произошло и к последующим записям были применены другие значения автосчетчика, это может привести к разрыву между значениями автосчетчика и ожидаемым поведением.
Управление кэшем
Для повышения производительности SQL Server заранее выделяет количество порядковых номеров, указанное в аргументе CACHE.
Например, новая последовательность создается с начальным значением 1 и размером кэша 15. Когда требуется первое значения, из памяти становятся доступными значения с 1 по 15. Последнее кэшированное значение (15) записывается в системные таблицы на диск. Когда используются все 15 номеров, то следующий запрос (для номера 16) вызывает повторное выделение кэша. Новое последнее кэшированное значение (30) записывается в системные таблицы.
Если ядро СУБД останавливается после использования 22 номеров, то следующий порядковый номер, ожидающий в памяти (23), записывается в системные таблицы, заменяя ранее хранившийся номер.
После перезапуска SQL Server, когда требуется порядковый номер, считывается начальный номер из системных таблиц (23). В память выделяется кэш размером в 15 номеров (23–38), а следующий номер, не попавший в кэш (39), записывается в системные таблицы.
Если ядро СУБД непредвиденно завершает работу (например, из-за сбоя электропитания), то последовательность перезапускается с номера, считываемого из системных таблиц (39). Все порядковые номера, выделенные в память (но не запрошенные пользователем или приложением), теряются. При такой обработке возможны пропуски в номерах, однако гарантируется, что одно значение ни в коем случае не будет дважды назначено одному объекту последовательности, если для нее не задан параметр CYCLE или не выполнен перезапуск вручную.
Кэш хранится в памяти путем отслеживания текущего значения (последнего назначенного) и количества значений, оставшихся в кэше. Таким образом, объем памяти, используемый для кэша, всегда равен размеру двух экземпляров типа данных объекта последовательности.
Если установить аргумент кэша в значение NO CACHE, то текущее значение последовательности будет записываться в системные таблицы при каждом использовании последовательности. Это может снизить производительность за счет увеличения числа обращений к диску, но снижает вероятность нежелательных пропусков номеров. Пропуски по-прежнему возможны, если номера запрашиваются с помощью функций NEXT VALUE FOR или sp_sequence_get_range, однако это означает, что пропущенные номера не используются либо используются в незафиксированных транзакциях.
Если в объекте последовательности используется параметр CACHE, то при перезапуске объекта последовательности или изменении свойств INCREMENT, CYCLE, MINVALUE, MAXVALUE или размера кэша кэш записывается в системные таблицы до выполнения изменения. Затем кэш перезагружается, начиная с текущего значения (номера не пропускаются). Изменение размера кэша вступает в силу немедленно.
Параметр CACHE при наличии кэшированных значений
Следующая процедура выполняется каждый раз, когда в объекте последовательности запрашивается создание следующего значения для параметра CACHE, если в кэше в памяти для объекта последовательности доступны неиспользованные значения.
Вычисляется следующее значение для объекта последовательности.
Новое текущее значение для объекта последовательности обновляется в памяти.
Вычисленное значение возвращается к вызывающей инструкции.
Параметр CACHE при пустом кэше
Следующая процедура выполняется каждый раз, когда в объекте последовательности запрашивается создание следующего значения для параметра CACHE, если кэш пуст.
Вычисляется следующее значение для объекта последовательности.
Вычисляется последнее значение для нового кэша.
Строка системной таблицы для объекта последовательности блокируется, а значение, вычисленное на шаге 2 (последнее значение), записывается в системную таблицу. Создается событие Xevent cache-exhausted, чтобы сообщить пользователю о новом сохраненном значении.
Параметр NO CACHE
Следующая процедура выполняется каждый раз, когда в объекте последовательности запрашивается создание следующего значения для параметра NO CACHE.
Вычисляется следующее значение для объекта последовательности.
Новое текущее значение для объекта последовательности записывается в системную таблицу.
Вычисленное значение возвращается к вызывающей инструкции.
Метаданные
Чтобы получить сведения о последовательностях, запросите представление sys.sequences.
Безопасность
Разрешения
Необходимо разрешение CREATE SEQUENCE, ALTERили CONTROL для схемы SCHEMA.
Члены предопределенных ролей базы данных db_owner и db_ddladmin могут создавать, изменять и удалять объекты последовательности.
Члены предопределенных ролей базы данных db_owner и db_datawriter могут обновлять объекты последовательности, вызывая создание номеров.
В следующем примере пользователю AdventureWorks\Larry предоставляется разрешение на создание последовательностей в схеме Test.
GRANT CREATE SEQUENCE ON SCHEMA::Test TO [AdventureWorks\Larry]
Владение объектом последовательности может быть передано с помощью инструкции ALTER AUTHORIZATION.
Если в последовательности используется определяемый пользователем тип данных, то создатель последовательности должен иметь разрешение REFERENCES для этого типа.
Audit
Для аудита инструкции CREATE SEQUENCE отслеживайте SCHEMA_OBJECT_CHANGE_GROUP.
Примеры
Примеры создания последовательностей и использования функции NEXT VALUE FOR для формирования порядковых номеров см. в разделе Порядковые номера.
В большинстве из следующих примеров объекты последовательности создаются в схеме с именем Test.
Чтобы создать схему Test, выполните следующую инструкцию.
CREATE SCHEMA Test ;
GO
А. Создание последовательности, увеличивающейся на 1
В следующем примере пользователь Thierry создает последовательность с именем CountBy1, которая увеличивается на единицу при каждом использовании.
CREATE SEQUENCE Test.CountBy1
START WITH 1
INCREMENT BY 1 ;
GO
B. Создание последовательности, уменьшающейся на 1
В следующем примере отсчет начинается с 0 и идет по отрицательным числам, уменьшаясь на единицу при каждом использовании.
CREATE SEQUENCE Test.CountByNeg1
START WITH 0
INCREMENT BY -1 ;
GO
В. Создание последовательности, увеличивающейся на 5
В следующем примере создается последовательность, которая увеличивается на 5 при каждом обращении.
CREATE SEQUENCE Test.CountBy1
START WITH 5
INCREMENT BY 5 ;
GO
D. Создание последовательности, начинающейся с заданного числа
После импорта таблицы Thierry замечает, что максимальный номер идентификатора составляет 24 328. Thierry требуется последовательность, которая будет создавать номера, начиная с 24 329. В следующем коде создается последовательность, начинающаяся с 24 329 и увеличивающаяся на 1.
CREATE SEQUENCE Test.ID_Seq
START WITH 24329
INCREMENT BY 1 ;
GO
Е. Создание последовательности со значениями по умолчанию
В следующем примере создается последовательность со значениями по умолчанию.
CREATE SEQUENCE Test.TestSequence ;
Чтобы просмотреть свойства последовательности, выполните следующую инструкцию.
SELECT * FROM sys.sequences WHERE name = 'TestSequence' ;
Частичный перечень выходных данных демонстрирует значения по умолчанию.
Выходные данные | Default value |
---|---|
start_value |
-9223372036854775808 |
increment |
1 |
minimum_value |
-9223372036854775808 |
maximum_value |
9223372036854775807 |
is_cycling |
0 |
is_cached |
1 |
current_value |
-9223372036854775808 |
F. Создание последовательности с заданным типом данных
В следующем примере создается последовательность с типом данных smallint и диапазоном значений от –32 768 до 32 767.
CREATE SEQUENCE SmallSeq
AS smallint ;
G. Создание последовательности с использованием всех аргументов
В следующем примере создается последовательность с именем DecSeq, использующая тип данных decimal и диапазон от 0 до 255. Последовательность начинается со 125 и увеличивается на 25 при каждом создании номера. Поскольку для последовательности настроено циклическое повторение при превышении максимального значения 200, она перезапускается с минимального значения 100.
CREATE SEQUENCE Test.DecSeq
AS decimal(3,0)
START WITH 125
INCREMENT BY 25
MINVALUE 100
MAXVALUE 200
CYCLE
CACHE 3
;
Чтобы просмотреть первое значение, выполните следующую инструкцию. Параметр START WITH
равен 125.
SELECT NEXT VALUE FOR Test.DecSeq;
Выполните инструкцию еще три раза, чтобы вернуть значения 150, 175 и 200.
Снова выполните инструкции, чтобы увидеть, как начальное значение вернется к значению параметра MINVALUE
, равного 100.
Выполните следующий код, чтобы подтвердить размер кэша и показать текущее значение.
SELECT cache_size, current_value
FROM sys.sequences
WHERE name = 'DecSeq' ;
См. также
ALTER SEQUENCE (Transact-SQL)
DROP SEQUENCE (Transact-SQL)
СЛЕДУЮЩЕЕ ЗНАЧЕНИЕ ДЛЯ (Transact-SQL)
Порядковые номера