Создание таблицы (Transact-SQL) IDENTITY (свойство)CREATE TABLE (Transact-SQL) IDENTITY (Property)

ОБЛАСТЬ ПРИМЕНЕНИЯ ЭТОЙ СТАТЬИ:даSQL Server (начиная с версии 2008)даБаза данных SQL AzureдаХранилище данных SQL AzureнетХранилище параллельных данныхTHIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)yesAzure SQL DatabaseyesAzure SQL Data Warehouse noParallel Data Warehouse

Создает в таблице столбец идентификаторов.Creates an identity column in a table. Это свойство указывается в инструкциях языка Transact-SQLTransact-SQL CREATE TABLE и ALTER TABLE.This property is used with the CREATE TABLE and ALTER TABLE Transact-SQLTransact-SQL statements.

Примечание

Свойство IDENTITY отличается от SQL-DMO удостоверение свойство, которое предоставляет доступ к свойству идентификаторов строк столбца.The IDENTITY property is different from the SQL-DMO Identity property that exposes the row identity property of a column.

Значок ссылки на раздел Синтаксические обозначения в Transact-SQLTopic link icon Transact-SQL Syntax Conventions

СинтаксисSyntax


IDENTITY [ (seed , increment) ]  

АргументыArguments

Начальное значениеseed
Значение, присваиваемое самой первой строке, загружаемой в таблицу.Is the value that is used for the very first row loaded into the table.

приращениеincrement
Значение приращения, которое прибавляется к значению идентификатора предыдущей загруженной строки.Is the incremental value that is added to the identity value of the previous row that was loaded.

Необходимо указывать либо оба аргумента (и seed, и increment), либо не указывать ни одного из них.You must specify both the seed and increment or neither. Если ничего не указано, применяется значение по умолчанию (1,1).If neither is specified, the default is (1,1).

ЗамечанияRemarks

Столбцы идентификаторов можно использовать для формирования значений ключей.Identity columns can be used for generating key values. Свойство идентификаторов столбца гарантирует следующее.The identity property on a column guarantees the following:

  • Каждое новое значение будет сформировано на основе текущих аргументов seed и increment.Each new value is generated based on the current seed & increment.

  • Каждое новое значение для определенной транзакции будет отлично от других параллельных транзакций для таблицы.Each new value for a particular transaction is different from other concurrent transactions on the table.

    Свойство идентификаторов столбца не гарантирует следующее.The identity property on a column does not guarantee the following:

  • Уникальность значения — уникальность следует обеспечивать с помощью ПЕРВИЧНОГО ключа или UNIQUE ограничение или UNIQUE индекса.Uniqueness of the value – Uniqueness must be enforced by using a PRIMARY KEY or UNIQUE constraint or UNIQUE index.

  • Последовательные значения в пределах транзакции – транзакции вставки нескольких строк для получения последовательные значения строки, так как может произойти другие параллельные операции вставки для таблицы не гарантируется.Consecutive values within a transaction – A transaction inserting multiple rows is not guaranteed to get consecutive values for the rows because other concurrent inserts might occur on the table. Если значения должны быть последовательными, то транзакции необходимо использовать монопольную блокировку для таблицы или SERIALIZABLE уровень изоляции.If values must be consecutive then the transaction should use an exclusive lock on the table or use the SERIALIZABLE isolation level.

  • Последовательные значения после перезапуска сервера или другого сбояSQL ServerSQL Server может кэшировать значения идентификаторов для повышения производительности и некоторые из присвоенных значений могут быть потеряны во время перезапуска сбоя или сервера базы данных.Consecutive values after server restart or other failuresSQL ServerSQL Server might cache identity values for performance reasons and some of the assigned values can be lost during a database failure or server restart. Это может вызвать пропуски в значениях идентификатора при вставке.This can result in gaps in the identity value upon insert. Если пропуски недопустимы, приложение должно использовать собственный механизм для создания значений ключей.If gaps are not acceptable then the application should use its own mechanism to generate key values. Использование генератора последовательностей с NOCACHE может привести к ограничению пропусков в неподтвержденных транзакциях.Using a sequence generator with the NOCACHE option can limit the gaps to transactions that are never committed.

  • Повторное использование значений — для свойства указанному идентификатору с определенной аргументами seed и increment, удостоверение, не используются повторно подсистемой.Reuse of values – For a given identity property with specific seed/increment, the identity values are not reused by the engine. Если определенная инструкция вставки завершается с ошибкой или производится ее откат, использованные значения идентификаторов не будут созданы повторно.If a particular insert statement fails or if the insert statement is rolled back then the consumed identity values are lost and will not be generated again. Это может привести к появлению пропусков при создании последующих значений идентификаторов.This can result in gaps when the subsequent identity values are generated.

    Эти ограничения были созданы намеренно и предназначены для повышения производительности, поскольку они являются допустимыми во многих типичных ситуациях.These restrictions are part of the design in order to improve performance, and because they are acceptable in many common situations. Если из-за этих ограничений невозможно использовать значения идентификаторов, рекомендуется создать отдельную таблицу, содержащую текущее значение, управление доступом к которой и назначение чисел будет выполняться приложением.If you cannot use identity values because of these restrictions, create a separate table holding a current value and manage access to the table and number assignment with your application.

    Если таблица со столбцом идентификаторов опубликована для репликации, этот столбец должен обслуживаться в соответствии с типом репликации.If a table with an identity column is published for replication, the identity column must be managed in a way that is appropriate for the type of replication used. Дополнительные сведения см. в статье Репликация столбцов идентификаторов.For more information, see Replicate Identity Columns.

    Для каждой таблицы можно создать только один столбец идентификаторов.Only one identity column can be created per table.

    В таблицах, оптимизированных для памяти, в качестве начального значения и значения приращения должно быть задано 1,1.In memory-optimized tables the seed and increment must be set to 1,1. Установка начального значения или приращения значение, отличное от 1 приведет к следующей ошибке: использование начального значения и приращения другие значения 1 не поддерживается с таблицами, оптимизированными для памяти.Setting the seed or increment to a value other than 1 results in the following error: The use of seed and increment values other than 1 is not supported with memory optimized tables.

ПримерыExamples

A.A. Свойство IDENTITY в инструкции CREATE TABLEUsing the IDENTITY property with CREATE TABLE

В следующем примере производится создание новой таблицы со свойством IDENTITY для получения автоматически увеличивающегося идентификационного номера.The following example creates a new table using the IDENTITY property for an automatically incrementing identification number.

USE AdventureWorks2012;  

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');  

Б.B. Базовый синтаксис для поиска промежутков в нумерации идентификаторовUsing generic syntax for finding gaps in identity values

Следующий пример демонстрирует базовый синтаксис для поиска разрывов в нумерации идентификаторов, возникающих при удалении данных.The following example shows generic syntax for finding gaps in identity values when data is removed.

Примечание

Первая часть данного скрипта Transact-SQLTransact-SQL приведена только в учебных целях.The first part of the following Transact-SQLTransact-SQL script is designed for illustration only. Можно запустить Transact-SQLTransact-SQL сценарий, начиная с комментария: -- Create the img table.You can run the Transact-SQLTransact-SQL script that starts with the comment: -- 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;  

См. также:See Also

ALTER TABLE (Transact-SQL) ALTER TABLE (Transact-SQL)
CREATE TABLE (Transact-SQL) CREATE TABLE (Transact-SQL)
DBCC CHECKIDENT (Transact-SQL) DBCC CHECKIDENT (Transact-SQL)
IDENT_INCR ( Transact-SQL ) IDENT_INCR (Transact-SQL)
@@IDENTITY (Transact-SQL) @@IDENTITY (Transact-SQL)
УДОСТОВЕРЕНИЕ ( Функция ) ( Transact-SQL ) IDENTITY (Function) (Transact-SQL)
IDENT_SEED ( Transact-SQL ) IDENT_SEED (Transact-SQL)
SELECT (Transact-SQL) SELECT (Transact-SQL)
SET IDENTITY_INSERT ( Transact-SQL ) SET IDENTITY_INSERT (Transact-SQL)
Репликация столбцов идентификаторовReplicate Identity Columns