Отличия SEQUENCE от IDENTITY в Microsoft SQL Server

Приветствую Вас на сайте Info-Comp.ru! Сегодня я, как и обещал в одном из прошлых материалов, расскажу Вам, чем отличается SEQUENCE от IDENTITY в Microsoft SQL Server.

Для начала давайте определимся, чем по факту является SEQUENCE и IDENTITY в Microsoft SQL Server, т.е. дадим определение, а затем перейдем к рассмотрению их отличий.

Отличия SEQUENCE от IDENTITY в Microsoft SQL Server

Что такое 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;

Скриншот 1

Значение SEQUENCE можно получить, не вставляя строку в таблицу

В отличие от IDENTITY, значения которого создаются при вставке строк в таблицу, значения SEQUENCE можно получить без вставки строки, так как для получения значения последовательности используется вызов функции NEXT VALUE FOR.

Данную функцию можно использовать в простом запросе SELECT.

   
   SELECT NEXT VALUE FOR TestSequence AS [SequenceValue];

Скриншот 2

Заметка! Чем отличаются функции от хранимых процедур в 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

Скриншот 3

Как видим, в моем случае первое значение из диапазона 11, а последнее 15.

Заметка! Новичкам рекомендую посмотреть мой видеокурс по T-SQL для начинающих, в нем подробно рассмотрены все базовые конструкции языка T-SQL.

На сегодня это все, надеюсь, материал был Вам полезен, пока!

Понравилась статья? Поделиться с друзьями:
Заметки IT специалиста
Комментарии: 1
  1. Админ (автор)

    Приглашаю всех желающих пройти мои онлайн-курсы по изучению языка T-SQL – https://self-learning.ru/courses/t-sql
    На курсах используется моя авторская последовательная методика обучения и рассматриваются все конструкции языка SQL и T-SQL. Каждый курс включает огромное количество материалов: видео, текстовый материал, тесты, домашние задания, скрипты, а также сертификат о прохождении.
    На курсах Вы можете заниматься в комфортном для себя темпе не выходя из дома в любое удобное для Вас время.

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:
Нажимая на кнопку «Отправить комментарий», я даю согласие на обработку персональных данных и принимаю политику конфиденциальности.