Приветствую Вас на сайте Info-Comp.ru! Сегодня я, как и обещал в одном из прошлых материалов, расскажу Вам, чем отличается SEQUENCE от IDENTITY в Microsoft SQL Server.
Для начала давайте определимся, чем по факту является SEQUENCE и IDENTITY в Microsoft SQL Server, т.е. дадим определение, а затем перейдем к рассмотрению их отличий.
- Что такое SEQUENCE
- Что такое IDENTITY
- Чем отличается SEQUENCE от IDENTITY в SQL Server
- Значение SEQUENCE можно получить, не вставляя строку в таблицу
- SEQUENCE можно изменить с помощью инструкции ALTER
- SEQUENCE может иметь максимальное значение
- SEQUENCE можно запрограммировать
- Из SEQUENCE можно получить сразу несколько значений
Что такое SEQUENCE
SEQUENCE (последовательность) – это пользовательский объект SQL Server, который генерирует числовые значения в определенной последовательности в соответствии с заданной спецификацией.
С помощью SEQUENCE можно формировать значения для столбца идентификаторов в таблицах.
Данный объект появился в 2012 версии Microsoft SQL Server, ранее для формирования значений столбцов идентификаторов в таблицах использовалось свойство IDENTITY.
Более подробно о последовательности, с рассмотрением множества примеров создания, изменения и использования SEQUENCE, я рассказывал в материале – Объект SEQUENCE (последовательность) в Microsoft SQL Server
Что такое IDENTITY
IDENTITY – это свойство таблицы, которое используется для создания столбца идентификаторов.
Значения для столбца со свойством IDENTITY формируются в соответствии с заданной спецификацией, в частности, задаётся значение, присваиваемое самой первой строке и шаг приращения, т.е. значение, которое прибавляется к значению идентификатора предыдущей вставленной строки.
Синтаксис достаточно простой (указывается при создании таблицы)
IDENTITY [ (seed , increment) ]
Где,
- seed – значение первой строки;
- increment – шаг приращения.
Здесь стоит отметить, что необходимо указывать либо оба параметра, либо не указывать ни один из них, в этом случае будут применяться значения по умолчанию – это (1,1).
Чем отличается SEQUENCE от IDENTITY в SQL Server
Сейчас давайте по пунктам рассмотрим, чем же отличается SEQUENCE от IDENTITY.
SEQUENCE – это объект, а IDENTITY – это свойство
Из определений двух этих терминов сразу же видно, что это две фундаментально разные сущности, назовем их так. Иными словами, SEQUENCE – это объект, который создается отдельно, и он не привязан ни к одной таблице, т.е. мы его можем использовать в нескольких таблицах.
А IDENTITY – это свойство одной конкретной таблицы, и оно, соответственно, привязано к этой таблице.
Поскольку SEQUENCE – это объект, мы можем посмотреть все его метаданные, точно так же, как и у других объектов в SQL Server (таблиц, процедур, представлений и так далее. Пример того, как можно получить список и описание всех таблиц в базе данных, можете посмотреть в моей статье, которая так и называется – Как получить список всех таблиц в базе данных Microsoft SQL Server?).
Заметка! Еще больше статей, посвященных Microsoft SQL Server, Вы можете найти в материале – Сборник статей для изучения Microsoft SQL Server
Для того чтобы узнать, какие последовательности есть в базе данных и все их метаданные, включая параметры, с которыми они создавались, можно использовать системное представление sys.sequences
SELECT * FROM sys.sequences;
Значение SEQUENCE можно получить, не вставляя строку в таблицу
В отличие от IDENTITY, значения которого создаются при вставке строк в таблицу, значения SEQUENCE можно получить без вставки строки, так как для получения значения последовательности используется вызов функции NEXT VALUE FOR.
Данную функцию можно использовать в простом запросе SELECT.
SELECT NEXT VALUE FOR TestSequence AS [SequenceValue];
Заметка! Чем отличаются функции от хранимых процедур в T-SQL.
SEQUENCE можно изменить с помощью инструкции ALTER
Как мы уже знаем, SEQUENCE – это объект, и у него есть достаточно много интересных параметров, которые мы можем изменять уже после создания самого объекта последовательности. Это делается с помощью обычной инструкции ALTER.
Свойство IDENTITY имеет гораздо меньше параметров, которые, к тому же, мы не можем изменить инструкцией ALTER, ведь это не объект (для этих целей используются различные функции).
Объект SEQUENCE изменяется инструкцией ALTER SEQUENCE, таким образом, мы можем, например:
- Сбросить значение последовательности до его начального значения;
- Задать цикличность последовательности;
- Управлять кэшем;
- А также изменять другие параметры
Допустим, Вам нужно перезапустить последовательность, т.е. сделать так, чтобы значения начались с самого начала или с определенного значения, для этого Вы можете использовать вот такую инструкцию
ALTER SEQUENCE TestSequence RESTART WITH 1;
где,
- TestSequence – это название последовательности;
- 1 – это новое начальное значение последовательности.
SEQUENCE может иметь максимальное значение
Для свойства IDENTITY в таблице нельзя задать максимальное значение. А у объекта последовательности SEQUENCE можно, так же, как и минимальное его значение.
Например, в следующем примере мы создаем последовательность с названием TestSequence и указанием максимального и минимального значения этой последовательности.
CREATE SEQUENCE TestSequence START WITH 1 INCREMENT BY 1 MINVALUE 1 MAXVALUE 50;
SEQUENCE можно запрограммировать
Поскольку у SEQUENCE много различных параметров, мы можем запрограммировать работу последовательности.
Например, указать начальное, минимальное, максимальное значение, а также задать цикличность, в итоге мы можем начать идентификацию, скажем, со 100, закончив на 200, затем начать с 1 и так до 200, а дальше по кругу.
Вот реализация такой последовательности
CREATE SEQUENCE TestSequence START WITH 100 INCREMENT BY 1 MINVALUE 1 MAXVALUE 200 CYCLE;
Из SEQUENCE можно получить сразу несколько значений
Кроме того, что мы можем напрямую обратиться к SEQUENCE и получить следующее значение этой последовательности, мы еще можем получить не одно значение, а сразу несколько значений за один раз, что в случае с IDENTITY никак сделать не получится.
Для получения диапазона значений из объекта последовательности используется процедура sp_sequence_get_range.
В следующем примере мы запросим диапазон из 5 значений последовательности TestSequence. Для этого в параметрах процедуры sp_sequence_get_range укажем:
- @sequence_name – название объекта последовательности;
- @range_size – сколько значений последовательности нам нужно;
- @range_first_value – выходной параметр, который возвращает первое значение из запрашиваемого диапазона последовательности;
- @range_last_value – выходной параметр, который возвращает последнее значение из запрашиваемого диапазона последовательности.
Для получения значений выходных параметров предварительно я создам две переменные (@FirstSequenceValue и @LastSequenceValue).
DECLARE @FirstSequenceValue SQL_VARIANT, @LastSequenceValue SQL_VARIANT; EXEC sp_sequence_get_range @sequence_name = N'TestSequence', @range_size = 5, @range_first_value = @FirstSequenceValue OUTPUT, @range_last_value = @LastSequenceValue OUTPUT; SELECT @FirstSequenceValue AS FirstSequenceValue, @LastSequenceValue AS LastSequenceValue
Как видим, в моем случае первое значение из диапазона 11, а последнее 15.
Заметка! Новичкам рекомендую посмотреть мой видеокурс по T-SQL для начинающих, в нем подробно рассмотрены все базовые конструкции языка T-SQL.
На сегодня это все, надеюсь, материал был Вам полезен, пока!
Приглашаю всех желающих пройти мои онлайн-курсы по изучению языка T-SQL – https://self-learning.ru/courses/t-sql
На курсах используется моя авторская последовательная методика обучения и рассматриваются все конструкции языка SQL и T-SQL. Каждый курс включает огромное количество материалов: видео, текстовый материал, тесты, домашние задания, скрипты, а также сертификат о прохождении.
На курсах Вы можете заниматься в комфортном для себя темпе не выходя из дома в любое удобное для Вас время.