다음을 통해 공유


CREATE TABLE(Transact-SQL) IDENTITY (Property)

적용 대상:SQL 서버Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsMicrosoft Fabric 의 웨어하우스Microsoft Fabric의 SQL 데이터베이스

테이블에 ID 열을 만듭니다. 이 속성은 와 CREATE TABLEALTER TABLE Transact-SQL 명제와 함께 사용됩니다.

Note

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

Transact-SQL 구문 표기 규칙

Syntax

패브릭 데이터 웨어하우스의 문법:

IDENTITY 
IDENTITY [ (seed , increment) ]

Arguments

seed

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

increment

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

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

Remarks

ID 열은 키 값을 생성하는 데 사용할 수 있습니다.

열의 ID 속성은 다음 조건을 보장합니다.

  • 각 새 값은 현재 시드 및 증가에 따라 생성됩니다.

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

열의 ID 속성은 다음 조건을 보장하지 않습니다.

  • 의 고유성 - 고유성은 또는 PRIMARY KEY 제약 조건 또는 UNIQUEUNIQUE 인덱스로 적용해야 합니다.

  • 트랜잭션 내의 연속 값 - 여러 행을 삽입하는 트랜잭션은 테이블에서 다른 동시 삽입이 발생할 수 있으므로 행에 대한 연속 값을 가져올 수 없습니다. 값이 연속되어야 하는 경우 트랜잭션은 테이블에서 배타적 잠금을 사용하거나 격리 수준을 사용해야 SERIALIZABLE 합니다.

  • 서버 다시 시작 또는 다른 실패 후 연속적인 값 - SQL Server는 성능상의 이유로 ID 값을 캐싱할 수 있으며 데이터베이스 오류 또는 서버 재시작 중에 지정된 값의 일부가 손실될 수 있습니다. 그러면 삽입 시 ID 값에서 간격이 발생할 수 있습니다. 간격이 허용되지 않는 경우 애플리케이션은 자체 메커니즘을 사용하여 키 값을 생성해야 합니다. 옵션과 함께 NOCACHE 시퀀스 생성기를 사용하면 커밋되지 않은 트랜잭션으로의 간격을 제한할 수 있습니다.

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

이러한 제한은 성능을 향상시키기 위해 디자인의 일부이며, 많은 일반적인 상황에서 허용되기 때문입니다. 이러한 제한 사항으로 인해 ID 값을 사용할 수 없는 경우 현재 값을 포함하는 별도의 테이블을 만들고 애플리케이션을 사용하여 테이블 및 번호 할당에 대한 액세스를 관리합니다.

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

메모리 최적화 테이블에서 시드 및 증분은 .로 1, 1설정해야 합니다. 초기값 또는 증분을 다음 오류가 1발생하는 값이 아닌 The use of seed and increment values other than 1 is not supported with memory optimized tables 값으로 설정합니다.

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

열에 ID 속성이 설정되면 제거할 수 없습니다. 새 데이터 형식이 ID 속성과 호환되는 한 데이터 형식을 변경할 수 있습니다.

Fabric Data Warehouse에서는 또는 seed를 지정할 increment 수 없는데, 이 값들은 자동으로 관리되어 고유한 정수를 제공하기 때문입니다. BIGINT IDENTITY 는 문장에서 CREATE TABLE 열 정의에 필요한 전부입니다. 자세한 내용은 Fabric Data Warehouse의 IDENTITY를 참조하세요.

Fabric Data Warehouse 구현 차이 IDENTITY 에 적응한 후 대리 키 열을 사용하는 테이블을 Fabric Data Warehouse로 마이그레이션할 수 있습니다.

Azure Synapse Analytics는 지원 또는 제약 조건 또는 PRIMARY KEYUNIQUE 인덱스를 지원하지 UNIQUE 않습니다. 자세한 내용은 IDENTITY를 사용하여 Synapse SQL 풀에서 서로게이트 키를 만드는 방법을 참조 하세요. - Azure Synapse Analytics의 전용 SQL 풀에서는 데이터 웨어하우스의 분산 아키텍처 때문에 신원 값이 증분되지 않습니다. 자세한 내용은 IDENTITY를 사용하여 Synapse SQL 풀에서 서로게이트 키를 만드는 방법을 참조 하세요. - IDENTITY Azure Synapse Analytics의 서버리스 SQL 풀에서는 지원되지 않습니다.

Examples

A. CREATE TABLE에서 IDENTITY 속성 사용

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

USE AdventureWorks2022;
GO
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. ID 값의 간격을 찾기 위해 제네릭 구문을 사용합니다.

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

Note

다음 Transact-SQL 스크립트의 첫 번째 부분은 설명 목적으로만 제공되는 것입니다. -- Create the img table 주석으로 시작하는 Transact- SQL 스크립트를 실행할 수 있습니다.

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

A. Fabric Data Warehouse에서 IDENTITY 열이 있는 테이블을 생성하세요

적용 대상: 패브릭 데이터 웨어하우스

CREATE TABLE dbo.Employees (
    EmployeeID BIGINT IDENTITY,
    FirstName VARCHAR(50),
    LastName VARCHAR(50),
    Retired BIT
);

이 문은 매 새로운 행마다 자동으로 고유 EmployeeID값을 bigint 값으로 받는 테이블을 dbo.Employees 만듭니다. 자세한 내용은 Fabric Data Warehouse의 IDENTITY를 참조하세요.

SELECT... INTO 테이블을 복사하여 대상 테이블에 속성을 유지 IDENTITY 할 수 있습니다:

SELECT *
INTO dbo.RetiredEmployees
FROM dbo.Employees
WHERE Retired = 1;

대상 테이블의 열은 소스 테이블로부터 속성을 상속 IDENTITY 받습니다. 이 시나리오에 적용되는 제한 사항 목록은 SELECT - INTO 절의 데이터 타입 섹션을 참조하세요.