Поделиться через


IDENTITY (свойство) (Transact-SQL)

Создает в таблице столбец идентификаторов. Это свойство указывается в инструкциях языка Transact-SQL CREATE TABLE и ALTER TABLE.

ПримечаниеПримечание

Свойство IDENTITY отличается от свойства Identity распределенных объектов управления (SQL-DMO), обеспечивающего доступ к идентификаторам строк в столбцах.

Значок ссылки на разделСоглашения о синтаксисе в Transact-SQL

Синтаксис

IDENTITY [ (seed , increment) ]

Аргументы

  • seed
    Значение, присваиваемое самой первой строке, загружаемой в таблицу.

  • increment
    Значение приращения, которое прибавляется к значению идентификатора предыдущей загруженной строки.

Необходимо указывать либо оба аргумента (и seed, и increment), либо не указывать ни один из них. Если ничего не указано, применяются значения по умолчанию (1,1).

Замечания

Если в таблице со столбцом идентификаторов часто удаляются строки, между значениями идентификаторов могут возникнуть разрывы. Если это критично, не пользуйтесь свойством IDENTITY. Чтобы гарантировать отсутствие разрывов или заполнить уже имеющиеся, проверяйте существующие значения идентификаторов, а затем явно указывайте их при вводе, установив параметр SET IDENTITY_INSERT ON.

При повторном использовании значения удаленного идентификатора см. образец кода Б, где показано, как найти следующее доступное значение идентификатора. Укажите вместо tablename, column_type и MAX(column_type) - 1 имя таблицы, тип данных столбца идентификаторов и максимально допустимое числовое значение для данного типа, -1.

Инструкция DBCC CHECKIDENT позволяет проверить текущее значение и сравнить его с максимально допустимым значением для столбца идентификаторов.

Если таблица со столбцом идентификаторов опубликована для репликации, этот столбец должен обслуживаться в соответствии с типом репликации. Дополнительные сведения см. в разделе Репликация столбцов идентификаторов.

Примеры

А. Свойство IDENTITY в инструкции CREATE TABLE

В следующем примере производится создание новой таблицы со свойством IDENTITY для получения автоматически увеличивающегося идентификационного номера.

USE AdventureWorks
IF OBJECT_ID ('dbo.new_employees', 'U') IS NOT NULL
   DROP TABLE new_employees
GO
CREATE TABLE new_employees
(
 id_num int IDENTITY(1,1),
 fname varchar (20),
 minit char(1),
 lname varchar(30)
)

INSERT new_employees
   (fname, minit, lname)
VALUES
   ('Karin', 'F', 'Josephs')

INSERT new_employees
   (fname, minit, lname)
VALUES
   ('Pirkko', 'O', 'Koskitalo')

Б. Базовый синтаксис для поиска промежутков в нумерации идентификаторов

Следующий пример демонстрирует базовый синтаксис для поиска разрывов в нумерации идентификаторов, возникающих при удалении данных.

ПримечаниеПримечание

Первая часть данного сценария Transact-SQL приведена только в учебных целях. Сценарий Transact-SQL может быть выполнен только начиная с комментария: -- Create the img table.

-- Here is the generic syntax for finding identity value gaps in data.
-- The illustrative example starts here.
SET IDENTITY_INSERT tablename ON
DECLARE @minidentval column_type
DECLARE @maxidentval column_type
DECLARE @nextidentval column_type
SELECT @minidentval = MIN($IDENTITY), @maxidentval = MAX($IDENTITY)
    FROM tablename
IF @minidentval = IDENT_SEED('tablename')
   SELECT @nextidentval = MIN($IDENTITY) + IDENT_INCR('tablename')
   FROM tablename t1
   WHERE $IDENTITY BETWEEN IDENT_SEED('tablename') AND 
      @maxidentval AND
      NOT EXISTS (SELECT * FROM tablename t2
         WHERE t2.$IDENTITY = t1.$IDENTITY + 
            IDENT_INCR('tablename'))
ELSE
   SELECT @nextidentval = IDENT_SEED('tablename')
SET IDENTITY_INSERT tablename OFF
-- Here is an example to find gaps in the actual data.
-- The table is called img and has two columns: the first column 
-- called id_num, which is an increasing identification number, and the 
-- second column called company_name.
-- This is the end of the illustration example.

-- Create the img table.
-- If the img table already exists, drop it.
-- Create the img table.
IF OBJECT_ID ('dbo.img', 'U') IS NOT NULL
   DROP TABLE img
GO
CREATE TABLE img (id_num int IDENTITY(1,1), company_name sysname)
INSERT img(company_name) VALUES ('New Moon Books')
INSERT img(company_name) VALUES ('Lucerne Publishing')
-- SET IDENTITY_INSERT ON and use in img table.
SET IDENTITY_INSERT img ON

DECLARE @minidentval smallint
DECLARE @nextidentval smallint
SELECT @minidentval = MIN($IDENTITY) FROM img
 IF @minidentval = IDENT_SEED('img')
    SELECT @nextidentval = MIN($IDENTITY) + IDENT_INCR('img')
    FROM img t1
    WHERE $IDENTITY BETWEEN IDENT_SEED('img') AND 32766 AND
      NOT    EXISTS (SELECT * FROM img t2
          WHERE t2.$IDENTITY = t1.$IDENTITY + IDENT_INCR('img'))
 ELSE
    SELECT @nextidentval = IDENT_SEED('img')
SET IDENTITY_INSERT img OFF