UNIQUE 제약 조건 및 CHECK 제약 조건

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

SQL Server 테이블에서 데이터 무결성을 강제 적용하는 데 사용할 수 있는 두 가지 유형의 제약 조건으로 UNIQUE 제약 조건과 CHECK 제약 조건이 있습니다. 이는 중요한 데이터베이스 개체입니다.

이 문서에는 다음과 같은 섹션이 포함되어 있습니다.

UNIQUE 제약 조건

제약 조건은 SQL Server 데이터베이스 엔진이 적용하는 규칙입니다. 예를 들어 UNIQUE 제약 조건을 사용하여 기본 키에 참여하지 않는 특정 열에 중복 값이 입력되지 않도록 할 수 있습니다. UNIQUE 제약 조건과 PRIMARY KEY 제약 조건 모두 고유성을 적용하지만 기본 키가 아닌 열(또는 열 조합)의 고유성을 적용하려면 PRIMARY KEY 제약 조건 대신 UNIQUE 제약 조건을 사용합니다.

PRIMARY KEY 제약 조건과 달리 UNIQUE 제약 조건은 NULL 값을 허용합니다. 그러나 UNIQUE 제약 조건에 참여하는 모든 값과 마찬가지로 열당 하나의 null 값만 허용됩니다. UNIQUE 제약 조건은 FOREIGN KEY 제약 조건에 의해 참조할 수 있습니다.

테이블의 기존 열에 UNIQUE 제약 조건이 추가되면 기본적으로 데이터베이스 엔진이 열의 기존 데이터를 검사하여 모든 값이 고유한지 확인합니다. 중복된 값이 있는 열에 UNIQUE 제약 조건을 추가하면 데이터베이스 엔진이 오류를 반환하고 제약 조건이 추가되지 않습니다.

데이터베이스 엔진은 자동으로 UNIQUE 인덱스를 만들어 UNIQUE 제약 조건의 고유성 요구 사항을 적용합니다. 따라서 중복 행을 삽입하려고 하면 데이터베이스 엔진이 UNIQUE 제약 조건을 위반하여 테이블에 행을 추가할 수 없다는 오류 메시지를 반환합니다. 클러스터형 인덱스가 명시적으로 지정되지 않는 한, UNIQUE 제약 조건을 적용하기 위해 기본적으로 고유한 비클러스터형 인덱스가 만들어집니다.

CHECK 제약 조건

CHECK 제약 조건은 하나 이상의 열에서 허용되는 값을 제한하여 도메인 무결성을 강제 적용합니다. 논리 연산자를 기반으로 TRUE 또는 FALSE를 반환하는 논리(부울) 표현식을 사용하여 CHECK 제약 조건을 생성할 수 있습니다. 예를 들어 salary 열 값 범위 는 $15,000에서 $100,000까지의 데이터만 허용하는 CHECK 제약 조건을 만들어 제한할 수 있습니다. 이는 정규 급여 범위를 벗어나는 급여가 입력되는 것을 방지합니다. 논리 식은 다음과 같습니다. salary >= 15000 AND salary <= 100000

열 하나에 여러 개의 CHECK 제약 조건을 적용할 수 있습니다. 테이블 수준에서 단일 CHECK 제약 조건을 만들어 여러 열에 적용할 수도 있습니다. 예를 들어, 다중 열 CHECK 제약조건을 사용하여 country_region 열 값이 USA인 행의 state 열에도 두 문자 값이 있는지 확인할 수 있습니다. 이를 통해 한 위치에서 여러 조건을 확인할 수 있습니다.

CHECK 제약 조건은 열에 입력되는 값을 제어한다는 점에서 FOREIGN KEY 제약 조건과 유사합니다. 차이점은 유효한 값을 결정하는 방법에 있습니다. FOREIGN KEY 제약 조건은 다른 테이블에서 유효한 값 목록을 얻는 반면 CHECK 제약 조건은 논리 표현식에서 유효한 값을 결정합니다.

주의

암시적 또는 명시적 데이터 형식 변환을 포함하는 제약 조건으로 인해 특정 작업이 실패할 수 있습니다. 예를 들어 파티션 전환의 원본인 테이블에 정의된 이러한 제약 조건으로 인해 ALTER TABLE...SWITCH 작업이 실패할 수 있습니다. 제약 조건 정의에서 데이터 유형을 변환하지 마세요.

CHECK 제약 조건의 제한 사항

CHECK 제약 조건은 FALSE로 평가되는 값을 거부합니다. null 값은 UNKNOWN으로 평가되므로 표현식에 null 값이 있으면 제약 조건이 재정의될 수 있습니다. 예를 들어, MyColumn이 값 10(MyColumn=10)만 포함할 수 있도록 지정하는 intMyColumn에 제약 조건을 적용한다고 가정합니다. NULLMyColumn 값을 삽입할 경우 데이터베이스 엔진은 NULL을 삽입하고 오류를 반환하지 않습니다.

CHECK 제약 조건은 검사 중인 조건이 테이블의 어떤 행에 대해서도 FALSE가 아닌 경우 TRUE를 반환합니다. CHECK 제약 조건은 행 수준에서 작동합니다. 만든 테이블에 행이 없으면 이 테이블에 대한 모든 CHECK 제약 조건이 유효한 것으로 간주됩니다. 이러한 상황에서는 다음 예와 같이 예상치 못한 결과가 발생할 수 있습니다.

CREATE TABLE CheckTbl (col1 INT, col2 INT);
GO

CREATE FUNCTION CheckFnctn()
RETURNS INT
AS
BEGIN
    DECLARE @retval INT;
    SELECT @retval = COUNT(*)
    FROM CheckTbl;

    RETURN @retval;
END;
GO

ALTER TABLE CheckTbl ADD CONSTRAINT chkRowCount CHECK (dbo.CheckFnctn() >= 1);
GO

추가되는 CHECK 제약 조건은 CheckTbl 테이블에 최소 하나 이상의 행이 있어야 함을 지정합니다. 그러나 테이블에 이 제약 조건의 조건을 확인할 행이 없기 때문에 ALTER TABLE 문은 성공합니다.

CHECK 제약 조건은 DELETE 문 중에 유효성이 검사되지 않습니다. 따라서 특정 유형의 점검 제한조건이 있는 테이블에서 DELETE 문을 실행하면 예상치 못한 결과가 발생할 수 있습니다. 예를 들어, 테이블 CheckTbl에서 실행된 다음 문을 고려해 보겠습니다.

INSERT INTO CheckTbl VALUES (10, 10);
GO
DELETE CheckTbl WHERE col1 = 10;

CHECK 제약 조건이 테이블 CheckTbl에 최소한 1개의 행이 있어야 한다고 지정하더라도 DELETE 문은 성공합니다.

참고

테이블이 복제용으로 게시된 경우 Transact-SQL 문 ALTER TABLE 또는 SMO(SQL Server 관리 개체)를 사용하여 스키마를 변경해야 합니다. 테이블 디자이너 또는 데이터베이스 다이어그램 디자이너를 사용하여 스키마를 변경하면 테이블 삭제 및 재생성이 시도됩니다. 게시된 개체를 삭제할 수 없으므로 스키마가 변경되지 않습니다.

작업 문서
UNIQUE 제약 조건을 만드는 방법에 대해 설명합니다. UNIQUE 제약 조건 만들기
UNIQUE 제약 조건을 수정하는 방법에 대해 설명합니다. UNIQUE 제약 조건 수정
UNIQUE 제약 조건을 삭제하는 방법에 대해 설명합니다. UNIQUE 제약 조건 삭제
CHECK 제약 조건을 만드는 방법을 설명합니다. CHECK 제약 조건 만들기
복제 에이전트가 테이블에 데이터를 삽입하거나 업데이트할 때 CHECK 제약 조건을 비활성화하는 방법을 설명합니다. 복제할 때 CHECK 제약 조건 해제
테이블에서 데이터를 추가, 업데이트 또는 삭제할 때 CHECK 제약 조건을 사용하지 않도록 설정하는 방법을 설명합니다. INSERT 및 UPDATE 문에서 CHECK 제약 조건 해제
제약 조건 식을 변경하는 방법이나 특정 조건에 대한 제약 조건을 사용 또는 사용하지 않는 옵션에 대해 설명합니다. CHECK 제약 조건 수정
CHECK 제약 조건을 삭제하는 방법을 설명합니다. CHECK 제약 조건 삭제
CHECK 제약 조건의 속성을 보는 방법에 대해 설명합니다. 고유성 제약 조건 및 CHECK 제약 조건