Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Применимо к:SQL Server
База данных
SQL AzureУправляемый экземпляр
SQL AzureБаза данных SQL в Microsoft Fabric
Создает объект последовательности и указывает его свойства. Последовательность представляет собой определяемый пользователем объект, привязанный к схеме, который формирует последовательность числовых значений в соответствии со спецификацией, с которой эта последовательность создавалась. Последовательность числовых значений формируется в возрастающем или убывающем порядке с заданным интервалом; можно настроить перезапуск (зацикливание) последовательности, когда она исчерпана.
Последовательности, в отличие от столбцов удостоверений, не связаны с определенными таблицами. Приложение обращается к объекту последовательности, чтобы получить следующее значение. Приложения управляют связями между последовательностями и таблицами. Пользовательские приложения могут ссылаться на объект последовательности и распределять значения между несколькими строками и таблицами.
В отличие от значений столбцов удостоверений, создаваемых при вставке строк, приложение может получить следующий порядковый номер без вставки строки, вызвав next VALUE FOR. Получить несколько значений из последовательности за один раз можно с помощью функции sp_sequence_get_range .
Сведения и сценарии, использующие обе CREATE SEQUENCENEXT 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 | пользовательский 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 <констант>
Первое значение, возвращаемое объектом последовательности. Значение START должно быть меньше или равно максимальному и большему или равно минимальному значению объекта последовательности. По умолчанию начальным значением для нового объекта последовательности служит минимальное значение для объекта возрастающей последовательности и максимальное — для объекта убывающей.
Константа INCREMENT BY <>
Значение, используемое для увеличения (или уменьшения, если отрицательно) значения объекта последовательности для каждого вызова NEXT VALUE FOR функции. Если приращение является отрицательным значением, объект последовательности убывается; в противном случае это возрастает. Приращение не может быть 0. По умолчанию для нового объекта последовательности используется приращение 1.
[ константы< MINVALUE >| NO MINVALUE ]
Указывает граничные значения для объекта последовательности. По умолчанию минимальным значением для нового объекта последовательности служит минимальное значение для типа данных объекта последовательности. Для типа данных tinyint это ноль, для всех остальных типов данных — отрицательное число.
[ константы< MAXVALUE >| НЕТ MAXVALUE
Указывает граничные значения для объекта последовательности. По умолчанию максимальным значением для нового объекта последовательности служит максимальное значение для типа данных объекта последовательности.
[ ЦИКЛ | НЕТ ЦИКЛА ]
Свойство, которое указывает, перезапускается объект последовательности с минимального значения (или максимального для объектов убывающих последовательностей) или вызывает исключение, когда достигнуто максимальное (или максимальное) значение. Параметр цикла по умолчанию для новых объектов последовательности .NO CYCLE
Примечание.
SEQUENCE Велоспорт перезапускается из минимального или максимального значения, а не из начального значения.
[ КЭШ [ <константа> ] | НЕТ КЭША ]
Повышает производительность для приложений, использующих объекты последовательностей, сводя к минимуму число операций дискового ввода-вывода, которые требуются для создания порядковых номеров. По умолчанию — CACHE.
Например, если выбран размер кэша 50, SQL Server не сохраняет 50 отдельных значений. Он кэширует только текущее значение и количество значений, оставшихся в кэше. Это значит, что объем памяти для хранения кэша всегда равен размеру двух экземпляров типа данных объекта последовательности.
Примечание.
Если параметр кэша включен без указания размера кэша, ядро СУБД выбирает размер. Однако пользователи не должны полагаться на согласованный выбор. Корпорация Майкрософт может изменить этот метод вычисления размера кэша без предварительного уведомления.
При создании с 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 параметр, если перезапустить объект последовательности или изменить INCREMENTCYCLEMINVALUEMAXVALUEсвойства размера кэша, он приведет к записи кэша в системные таблицы перед изменением. Затем кэш перезагрузится, начиная с текущего значения (т. е. число не пропускается). Изменение размера кэша вступает в силу немедленно.
Параметр CACHE при наличии кэшированных значений
Следующий процесс происходит каждый раз, когда объект последовательности запрашивается для создания следующего значения параметра CACHE , если в кэше последовательности отсутствуют неиспользуемые значения.
- Вычисляется следующее значение для объекта последовательности.
- Новое текущее значение для объекта последовательности обновляется в памяти.
- Вычисленное значение возвращается к вызывающей инструкции.
Параметр CACHE при исчерпании кэша
Следующий процесс происходит каждый раз, когда объект последовательности запрашивается, чтобы создать следующее значение для CACHE параметра, если кэш исчерпан:
Вычисляется следующее значение для объекта последовательности.
Вычисляется последнее значение для нового кэша.
Строка системной таблицы для объекта последовательности блокируется, а значение, вычисленное на шаге 2 (последнее значение), записывается в системную таблицу. Кэшированные расширенные события запускаются для уведомления пользователя о новом сохраняемом значении.
Параметр 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
В следующем примере Тьерри создает последовательность с именем 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. Тьерри нуждается в последовательности, которая создает числа начиная с 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';
Частичный перечень выходных данных демонстрирует значения по умолчанию.
| Выходные данные | Значение по умолчанию |
|---|---|
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';