제약조건

W·2024년 1월 17일
0

MSSQL

목록 보기
9/33

CONSTRAINT(제약조건)

정의

영어로는 강제 라는 의미를 가지고 있다.

이를 SQL에 대입해보면 데이터를 처리하는 것에 있어서 강제할 사항을 정의한다 라고 이해하면 쉬울 것 같다.

이제 우리는 이를 제약조건이라고 부르기로 했다.

종류

  1. Primary Key Constraint (기본 키 제약 조건)

    • 테이블의 한 열 또는 여러 열의 조합을 기본 키로 지정하여 각 레코드를 고유하게 식별합니다.
    CREATE TABLE PNM_EMPL (
        EMPNO     NVARCHAR (10)  NOT NULL PRIMARY KEY,
    	// EMPNO 컬럼을 PK로 지정한다.
    ...
  2. Unique Constraint (고유 제약 조건)

    • 한 열 또는 여러 열의 조합에 대해 중복된 값을 허용하지 않도록 합니다. 기본 키와 유사하지만 NULL 값을 여러 개 허용할 수 있습니다.
    • UNIQUE 는 한 테이블에 여러개를 지정할 수 있지만, PRIMARY KEY 제약은 오로지 1개 만 지정할 수 있다.
    • NULL도 개수로 판단하여 한번의 null을 허용이 되며, 중복 null을 허용되지 않는다.
      CREATE TABLE PNM_EMPL (
          EMPNO     NVARCHAR (10)  NOT NULL UNIQUE,
       // EMPNO 컬럼에는 중복데이터가 허용되지 않는다.
       // ex) '01', '01' x
       //     '01', '02' o
      ...
  3. Check Constraint (검사 제약 조건)

    • 열에 특정 조건을 부여하여 데이터의 유효성을 검사하며, 조건에 맞지 않는 데이터의 삽입 또는 갱신을 방지합니다.
    CREATE TABLE PNM_EMPL (
        EMPNO     NVARCHAR (10)  NOT NULL,
    		CONSTRAINT CHK_EMPNO CHECK (EMPNO LIKE "ABC%")
     // EMPNO 컬럼의 데이터는 ABC로 시작하는 데이터여야 한다. 
    ...
  4. Foreign Key Constraint (외래 키 제약 조건)

    • 두 테이블 간의 관계를 정의하며, 부모 테이블의 기본 키와 자식 테이블의 외래 키 간의 일치 여부를 검사합니다.
    CREATE TABLE PNM_EMPL (
        EMPNO INT PRIMARY KEY,
        DEPTNO INT,
        CONSTRAINT FK_DEPTNO FOREIGN KEY (DEPTNO) REFERENCES PNM_DEPT(DEPTNO)
     // 여기서 PNM_DEPT는 참조데이터를 가진 테이블로 부모테이블이라고 명칭한다.
     // PNM_EMPL은 PNM_DEPT의 DEPTNO를 참조 조건으로 가지는 자식테이블이다.
    ...
  5. Default Constraint (기본값 제약 조건)

    • 열에 대한 기본값을 설정하여 데이터가 해당 열에 입력되지 않을 때 기본값이 사용되도록 합니다.
    CREATE TABLE PNM_EMPL (
        EMPNO     NVARCHAR (10)  NOT NULL,
    		RM        NVARCHAR (100) NOT NULL DEFAULT "ABC"
     // RM 컬럼은 별도로 insert되는 값이 없을 경우 기본값으로 ABC라는 값을 무조건 가지게 된다.
    ...
  6. NotNull Constraint (NOT NULL 제약 조건)

    • 열이 NULL 값을 허용하지 않도록 합니다. 각 레코드는 해당 열에 대한 유효한 값을 가져야 합니다.
      CREATE TABLE PNM_EMPL (
          EMPNO     NVARCHAR (10)  NOT NULL,
      //  EMPNO 컬럼에는 NULL이 허용되지 않는다.
      ...
  7. Clustered Index Constraint (클러스터형 인덱스 제약 조건)

    • 테이블의 데이터를 물리적으로 정렬하는데 사용되며, 해당 열에 대한 클러스터형 인덱스를 생성하는 제약 조건.
    CREATE TABLE PNM_EMPL (
        EMPNO     NVARCHAR (10)  NOT NULL,
    		CONSTRAINT [PK_PNM_EMPL] PRIMARY KEY CLUSTERED ([EMPNO] ASC)
    ...
  8. Non-Clustered Index Constraint (비클러스터형 인덱스 제약 조건)

    • 테이블의 데이터를 물리적으로 정렬하지 않고, 해당 열에 대한 비클러스터형 인덱스를 생성하는 제약 조건.
    CREATE TABLE PNM_EMPL (
        EMPNO     NVARCHAR (10)  NOT NULL PRIMARY KEY NONCLUSTERED
    ...

문법

  1. create일 경우

    CONSTRAINT 별로 문법이 다 다르다. ↑ 종류쪽 예시 참고.
  2. drop일 경우 (제거)

    DROP CONSTRAINT [제약조건명]
  3. alter일 경우

    ALTER TABLE [테이블명] ADD CONSTRAINT [제약조건명] [제약조건내용]
    // ex) ALTER TABLE PNM_EMPL ADD CONSTRAINT CHK_RM CHECK (RM LIKE 'ABC%')
    // PNM_EMPL 테이블에 CHK_RM이라는 제약조건을 추가. CHK_RM은 RM이라는 컬럼에 'ABC%'를
    // 만족하는 데이터를 가지는지 CHECK 한다.
  4. contraint의 list를 보고 싶을 경우

SELECT
    k.name AS [제약조건명],
    t.name AS TABLE_NAME,    
        CASE
            WHEN t.name LIKE 'PK%' THEN 'Primary Key'
            WHEN t.name LIKE 'FK%' THEN 'Foreign Key'
            WHEN t.name LIKE 'UQ%' THEN 'Unique'
            WHEN t.name LIKE 'CK%' THEN 'Check'
            ELSE 'Other'
        END AS [내용]
FROM sys.tables t
INNER JOIN sys.key_constraints k 
     ON t.object_id = k.parent_object_id;
profile
타협하는 순간 발전이 없어

0개의 댓글