반응형
반응형

n       CHECK 제약 조건

논리 연산자에 따라 TRUE 또는 FALSE 반환하는 논리식을 사용하여 CHECK 제약 조건을 생성할 있습니다. CHECK 제약 조건을 추가하면 데이터 무결성을 보장할 있을 아니라, CHECK 제약 조건에 위배되는 범위의 값을 조건절에서 검색하는 경우에는 실제로 테이블을 액세스하지 않고 결과를 바로 반환하므로 성능에도 도움이 됩니다. 이와 같이 성능에 도움이 되도록 하기 위해서는 CHECK 제약 조건을 WITH CHECK 옵션으로 생성해야 합니다.

하나에 여러 개의 CHECK 제약 조건을 적용할 있고, 테이블 내에서 테이블 단위로 CHECK 제약 조건을 만들어 여러 열에 적용할 수도 있습니다.

 

[따라하기] 열의 포맷 지정한 (컬럼) 단위의 CHECK 제약 조건 생성하기

CREATE TABLE ColCheckTest (

                           Seq int identity(1,1),

                           State char(3),

                           CONSTRAINT CK_State CHECK (State Like '[A-Z][0-9]S')

);

GO

 

[따라하기] 테이블 단위의 CHECK 제약 조건 생성하기

CREATE TABLE TblCheckTest (

                           Seq int identity(1,1),

                           MinValue int,

                           MaxValue int,

);

GO

ALTER TABLE TblCheckTest

ADD CONSTRAINT CK_Min_Max CHECK (MinValue <= MaxValue);

GO

 

CHECK 제약 조건은 FALSE 평가되는 값을 거부합니다. NULL 없는 값으로 평가되므로 식에 NULL 값이 있으면 제약 조건이 무시됩니다. 예를 들어 MyColumn = 10 같이 MyColumn 10 포함할 있도록 int MyColumn 대한 제약 조건을 지정한다고 가정합니다. MyColumn NULL 값을 삽입할 경우 SQL Server 2005 데이터베이스 엔진 에서는 NULL 삽입하고 오류를 반환하지 않습니다.

CHECK 제약 조건 정보는 동적 관린 sys.check_constraints에서 확인할 있습니다.

제약 조건에 직접 xml 데이터 형식 메서드를 사용할 없습니다. CHECK 제약 조건에서 xml 데이터 형식 메서드를 사용하고자 하는 경우에는 UDF 래퍼를 생성하여 xml 데이터 형식 메서드를 래핑하면 됩니다.  

Xml 데이터 형식 메서드를 직접 CHECK 제약 조건으로 생성하려고 하면 다음과 같은 오류가 반환됩니다.

 

메시지 423, 수준 16, 상태 16, 1

Xml 데이터 형식 메서드는 CHECK 제약 조건에서 지원되지 않습니다. 메서드 호출을 래핑하려면 스칼라 사용자 정의 함수를 만드십시오. 오류는 테이블 "XmlTest"에서 발생했습니다.

 

[따라하기] XML 데이터 형식 메서드를 활용하여 xml 열에 CHECK 제약 조건 생성하기

USE Tempdb

GO

CREATE FUNCTION my_udf(@var xml) returns bit

AS BEGIN

RETURN @var.exist('/ProductDescription/@ProductID')

END

GO

CREATE TABLE XMLCheckTest (

    Col1 int primary key,

    Col2 xml check(dbo.my_udf(Col2)=1))

GO

 

UDF 사용하여 보다 복잡한 CHECK 제약 조건의 생성이 가능합니다.

[따라하기] UDF 사용하여 CHECK 제약 조건 생성하기

-- 동일한 값은 행까지만 삽입하도록 하는 예제입니다.

USE tempdb;

GO

CREATE TABLE DoubleKeys(

                           key_col int NOT NULL,

                           Other char(1)

)

GO

CREATE FUNCTION dbo.fn_DoubleKeysCnt (@key AS INT) RETURNS INT

AS

BEGIN

  RETURN (SELECT COUNT(*) FROM DoubleKeys WHERE key_col = @key);

END

GO

-- UDF CHECK 제약 조건에 활용

ALTER TABLE DoubleKeys

  ADD CONSTRAINT CHK_DoubleKeys_NoMoreThanTwo

  CHECK (dbo.fn_DoubleKeysCnt(key_col) <= 2);

GO

-- 중복 데이터 INSERT

INSERT INTO DoubleKeys VALUES(1,'a');

INSERT INTO DoubleKeys VALUES(1,'a');

INSERT INTO DoubleKeys VALUES(1,'a');

INSERT INTO DoubleKeys VALUES(2,'a');

INSERT INTO DoubleKeys VALUES(2,'a');

INSERT INTO DoubleKeys VALUES(2,'a');

GO

-- 동일한 값은 건씩만 INSERT 되었음을 확인

SELECT * FROM DoubleKeys;

GO

 

n       DEFAULT 정의

열에 DEFAULT 정의가 있는 테이블로 행을 로드할 열에 대한 값이 지정되어 있지 않으면 SQL Server 2005 데이터베이스 엔진 에서 해당 열에 기본값을 삽입하도록 주는 기능입니다. NULL 허용하는 열을 사용하는 것은 바람직하지 않으므로 가능하면 열에 DEFAULT 정의를 정의하는 것이 보다 좋은 해결책입니다.

열에서 Null 값을 허용하지 않고 DEFAULT 정의도 없으면 열에 명시적으로 값을 지정해야 합니다. 그렇지 않으면 데이터베이스 엔진 열에서 NULL 값을 허용하지 않는다는 오류를 반환합니다.

반응형
반응형

n       PRIMARY KEY 제약 조건

테이블 생성 시에는 PRIMARY KEY 제약 조건을 지정합니다. PRIMARY KEY 제약 조건은 테이블을 생성할 때에 생성하는 것이 바람직하지만, PRIMARY KEY 제약 조건을 정의하지 않았더라도 테이블 생성 후에 추가로 생성할 있습니다. PRIMARY KEY 제약 조건을 설정할 열은 NOT NULL 속성을 가지고 있어야 하며, 고유한 데이터를 가지는 열이어야 합니다. 이상의 열에 PRIMARY KEY 정의될 때에는, 열에 중복된 값이 있을 있지만, 열을 조합한 값은 고유해야 합니다.

CREATE TABLE 문에서 PRIMARY KEY 정의하는 구문에 인덱스의 종류를 지정하지 않으면 PRIMARY KEY 클러스터형 인덱스 생성됩니다. 테이블들의 PRIMARY KEY 반드시 클러스터형 인덱스일 필요는 없으며, 클러스터형 인덱스 비클러스터형 인덱스 가지 성능적인 측면을 고려하여 효율적인 것을 사용해야 합니다.

 

[따라하기] 테이블 생성 PRIMARY KEY 제약 조건을 비클러스터형 인덱스 설정하기

CREATE TABLE Tab_Sample (

Col1                   int identity(1,1)           NOT NULL PRIMARY KEY Nonclustered,

Col2                   char(3)                       NULL,

Col3                   int                              NULL

);

GO

 

[따라하기] 테이블 생성 , PRIMARY KEY 제약 조건 설정하기

CREATE TABLE Tab_Sample (

Col1                   int identity(1,1)           NOT NULL,

Col2                   char(3)                       NULL,

Col3                   int                 NULL

);

GO

ALTER TABLE Tab_Sample

ADD CONSTRAINT PK_Tab_Sample PRIMARY KEY Nonclustered (Col1);

GO

 

n       UNIQUE 제약 조건

PRIMARY KEY 참여하지 않는 중에서 항상 고유한 값이 저장된다면 UNIQUE 제약 조건을 생성합니다. 데이터의 고유성이 보장될 뿐만 아니라, 응용 프로그램에서 데이터의 고유함을 확인할 필요가 없습니다.

 

n       FOREIGN KEY 제약 조건

참조 무결성이 보장되어야 하는 경우에는 FOREIGN KEY 제약 조건을 생성합니다. FOREIGN KEY 제약 조건이 없는 상태에서 응용 프로그램이 운영되는 상황에서 나중에 FOREIGN KEY 제약 조건을 추가하게 되면 응용 프로그램을 수정해야 하는 경우가 발생하므로, FOREIGN KEY 제약 조건은 최초에 테이블을 생성할 만드는 것이 좋습니다.

반응형

+ Recent posts

반응형