다음을 통해 공유


IDENTITY(속성)(Transact-SQL)

테이블에 ID 열을 만듭니다. 이 속성은 CREATE TABLE 및 ALTER TABLE Transact-SQL 문에 사용됩니다.

참고

IDENTITY 속성은 열의 행 ID 속성을 표시하는 SQL-DMO Identity 속성과 다릅니다.

적용 대상: SQL Server(SQL Server 2008 - 현재 버전)

항목 링크 아이콘 Transact-SQL 구문 표기 규칙

구문

IDENTITY [ (seed , increment) ]

인수

  • seed
    테이블에 로드되는 첫 번째 행에 사용하는 값입니다.

  • increment
    로드된 이전 행의 ID 값에 추가되는 증가값입니다.

초기값과 증가값을 모두 지정하거나 모두 지정하지 않아야 합니다. 둘 다 지정하지 않은 경우에는 기본값 (1,1)이 사용됩니다.

주의

ID 열은 키 값을 생성하는 데 사용할 수 있습니다. 열에 있는 IDENTITY 속성은 다음 사항을 보장합니다.

  • 각각의 새 값은 현재 초기값 및 증가값을 기반으로 생성됩니다.

  • 특정 트랜잭션에 대한 각각의 새 값은 테이블의 각 동시 트랜잭션마다 다릅니다.

열에 있는 IDENTITY 속성은 다음 사항을 보장하지 않습니다.

  • 값의 고유성 – 고유성은 PRIMARY KEY 또는 UNIQUE 제약 조건 또는 UNIQUE 인덱스를 사용하여 적용되어야 합니다.

  • 트랜잭션 내에서 연속적인 값 – 테이블에서 다른 동시 삽입이 발생할 수 있기 때문에 여러 행 삽입 트랜잭션은 행에 대한 연속적인 값 가져오기를 보장하지 않습니다. 값이 연속적이어야 하는 경우 트랜잭션에서 테이블에 대해 배타적 잠금을 사용하거나 SERIALIZABLE 격리 수준을 사용해야 합니다.

  • 서버 다시 시작 또는 다른 실패 후 연속적인 값 – SQL Server는 성능상의 이유로 ID 값을 캐싱할 수 있으며 데이터베이스 오류 또는 서버 재시작 중에 지정된 값의 일부가 손실될 수 있습니다. 그러면 삽입 시 ID 값에서 간격이 발생할 수 있습니다. 간격이 허용되지 않는 경우 응용 프로그램에서 NOCACHE 옵션이 있는 시퀀스 생성기를 사용하거나 고유 메커니즘을 사용하여 키 값을 생성해야 합니다.

  • 값의 재사용 – 특정 IDENTITY 속성에 특정 초기값/증가값이 지정된 경우, 이 ID 값은 엔진에서 다시 사용되지 않습니다. 특정 insert 문이 실패하거나 insert 문이 롤백되는 경우 사용된 ID 값은 손실되고 다시 생성되지 않습니다. 그 결과 후속 ID 값이 생성될 때 간격이 발생할 수 있습니다.

이러한 제한 사항은 일반적인 많은 상황에서 허용되므로 성능 개선을 위한 디자인의 일부입니다. 이러한 제한 사항 때문에 ID 값을 사용할 수 없는 경우 현재 값을 저장하는 별도 테이블을 만들고 응용 프로그램에 대한 테이블 및 번호 지정 액세스를 관리하십시오.

ID 열이 있는 테이블이 복제를 위해 게시된 경우 해당 ID 열은 사용되는 복제 유형에 적합한 방식으로 관리해야 합니다. 자세한 내용은 ID 열 복제를 참조하십시오.

ID 열은 테이블당 하나만 만들 수 있습니다.

1.CREATE TABLE에 IDENTITY 속성 사용

다음 예에서는 자동으로 ID를 증가시키는 IDENTITY 속성을 사용하여 새 테이블을 만듭니다.

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

2.일반 구문을 사용하여 ID 값 간의 간격 찾기

다음 예에서는 데이터가 제거되었을 때 ID 값에서 간격을 찾기 위한 일반 구문을 보여 줍니다.

참고

다음 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;

참고 항목

참조

ALTER TABLE(Transact-SQL)

CREATE TABLE(SQL Server)

DBCC CHECKIDENT(Transact-SQL)

IDENT_INCR(Transact-SQL)

@@IDENTITY(Transact-SQL)

IDENTITY(함수)(Transact-SQL)

IDENT_SEED(Transact-SQL)

SELECT(Transact-SQL)

SET IDENTITY_INSERT(Transact-SQL)

개념

ID 열 복제