CREATE TABLE(Transact-SQL) IDENTITY (Property)CREATE TABLE (Transact-SQL) IDENTITY (Property)

적용 대상: 예SQL Server 예Azure SQL Database 예Azure Synapse Analytics(SQL DW) 아니요병렬 데이터 웨어하우스 APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

테이블에 ID 열을 만듭니다.Creates an identity column in a table. 이 속성은 CREATE TABLE 및 ALTER TABLE Transact-SQLTransact-SQL 문에 사용됩니다.This property is used with the CREATE TABLE and ALTER TABLE Transact-SQLTransact-SQL statements.

참고

IDENTITY 속성은 열의 행 ID 속성을 표시하는 SQL-DMO Identity 속성과 다릅니다.The IDENTITY property is different from the SQL-DMO Identity property that exposes the row identity property of a column.

항목 링크 아이콘 Transact-SQL 구문 표기 규칙Topic 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
로드된 이전 행의 ID 값에 추가되는 증가값입니다.Is the incremental value that is added to the identity value of the previous row that was loaded.

초기값과 증가값을 모두 지정하거나 모두 지정하지 않아야 합니다.You must specify both the seed and increment or neither. 둘 다 지정하지 않은 경우에는 기본값 (1,1)이 사용됩니다.If neither is specified, the default is (1,1).

설명Remarks

ID 열은 키 값을 생성하는 데 사용할 수 있습니다.Identity columns can be used for generating key values. 열에 있는 IDENTITY 속성은 다음 사항을 보장합니다.The identity property on a column guarantees the following:

  • 각각의 새 값은 현재 시드 및 증가를 기준으로 생성됩니다.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.

열에 있는 IDENTITY 속성은 다음 사항을 보장하지 않습니다.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은 성능상의 이유로 ID 값을 캐싱할 수 있으며 데이터베이스 오류 또는 서버 재시작 중에 지정된 값의 일부가 손실될 수 있습니다.Consecutive values after server restart or other failures -SQL 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. 그러면 삽입 시 ID 값에서 간격이 발생할 수 있습니다.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.

  • 값의 재사용 – 특정 IDENTITY 속성에 특정 시드/증가값이 지정된 경우, 이 ID 값은 엔진에서 다시 사용되지 않습니다.Reuse of values - For a given identity property with specific seed/increment, the identity values are not reused by the engine. 특정 insert 문이 실패하거나 insert 문이 롤백되는 경우 사용된 ID 값은 손실되고 다시 생성되지 않습니다.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. 그 결과 후속 ID 값이 생성될 때 간격이 발생할 수 있습니다.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. 이러한 제한 사항 때문에 ID 값을 사용할 수 없는 경우 현재 값을 저장하는 별도 테이블을 만들고 애플리케이션에 대한 테이블 및 번호 지정 액세스를 관리하세요.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.

ID 열이 있는 테이블이 복제를 위해 게시된 경우 해당 ID 열은 사용되는 복제 유형에 적합한 방식으로 관리해야 합니다.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. 자세한 내용은 ID 열 복제를 참조하세요.For more information, see Replicate Identity Columns.

ID 열은 테이블당 하나만 만들 수 있습니다.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. CREATE TABLE에 IDENTITY 속성 사용Using the IDENTITY property with CREATE TABLE

다음 예에서는 자동으로 ID를 증가시키는 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.B. 일반 구문을 사용하여 ID 값 간의 간격 찾기Using generic syntax for finding gaps in identity values

다음 예에서는 데이터가 제거되었을 때 ID 값에서 간격을 찾기 위한 일반 구문을 보여 줍니다.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 (Function) (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)
ID 열 복제Replicate Identity Columns