CREATE TABLE (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 отличается от свойства Identity распределенных управляющих объектов SQL (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

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

incrementincrement
Значение приращения, которое прибавляется к значению идентификатора предыдущей загруженной строки.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).

RemarksRemarks

Столбцы идентификаторов можно использовать для формирования значений ключей.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:

  • Уникальность значения — уникальность значения следует обеспечить с помощью ограничения PRIMARY KEY или 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. Установка для параметров seed или increment значения, отличного от 1, приводит к следующей ошибке: "Использование для параметров seed и increment значений, отличных от 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)
IDENTITY (функция) (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