ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SQL 제약
    Database 2021. 5. 4. 14:05
    728x90

    제약

    "테이블"에 제약을 설정함으로써 저장될 데이터를 제한할 수 있다.

    NOT NULL 제약으로 NULL 값이 저장되지 않도록 제한할 수 있으며, 기본키(Primary Key), UNIQUE제약 등 데이터베이스 설계에 영향을 주는 중요한 개념이다.

    여기서 키 제약(PK, FK)등은 RDBMS에서 반드시 언급되는 사항으로 추가, 삭제에 대해 확실히 알아두어야 한다.

     

    제약은 테이블에 설정하는 것이다.

    CREATE TABLE로 테이블을 생성할때 제약을 정의할 수 있고

    ALTER TABLE로 제약을 새로 정의하거나 변경할 수 있다.

    이때, 하나의 열에 대해 설정하는 제약을 "열 제약"이라 부르며, 복수의 열에 대해 설정하는 제약을 "테이블 제약"이라 부른다.


    제약은 대표적으로 아래 6가지 제약이 있다.

    1. NOT NULL

    해당 컬럼에 NULL값(값을 넣지 않거나 공백처럼 값이 없는 경우)이 들어오지 못하게 함

    2. UNIQUE

    NULL은 허용하나 중복은 불가능함

    3. PRIMARY KEY

    NULL, 중복 불가능

    4. FOREIGN KEY

    NULL 가능, 타 테이블의 PRIMARY KEY여야 하고 해당 테이블의 칼럼에 삽입되지 않은 값은 사용 불가

    5. CHECK

    특정 범위 혹은 특정 값만 들어올 수 있게 함

    6. DEFAULT

    NULL 값이 들어올 시 지정된 값을 삽입함


    제약 정의하기

    열 제약

    대표적으로 NOT NULL 제약은 하나의 열에 대해 설정하는 열 제약이다.

    NOT NULL을 생략할 경우 디폴트로 NULL TRUE이다.

    CREATE TABLE 테이블명 (
    열명1 INTEGER NOT NULL,
    열명2 INTEGER NOT NULL, UNIQUE,
    열명3 VARCHAR(30)
    );

    아래의 예시에서 제약을 변경해보자

     


    열 제약 추가 및 변경

    ALTER TABLE 테이블명 MODIFY A INTEGER NULL;

    위처럼 ALTER TABLE로 열 제약을 추가하거나 변경할 수 있다.

    만약 위 예시와 같은 상황에서 A를 다시 NOT NULL 제약을 정의할 경우 제약을 위반하는 데이터가 있는지 먼저 검사한다.

    A열에 NULL 값이 존재하는 상황이라면 명령은 에러를 발생시킨다.

    어떤 제약을 추가하거나 변경할때 제약을 위반하는 데이터가 있는지 먼저 검사 후 명령을 적용한다는 점을 기억하자.

    (당연하다고 생각했지만, 그래도 기억하자.)

     



    테이블 제약

    한 개의 제약으로 복수의 열에 제약을 정의하는 방법을 테이블 제약이라 부른다.

    이때, CONSTRAINT 키워드를 이용해 테이블 제약의 이름을 정의할 수 있는데 이렇게 정의한 이름은 제약을 삭제할 때 정의한 제약의 이름을 사용해 삭제할 수 있다. 

    CREATE TABLE 테이블명 (
    열명1 INTEGER NOT NULL,
    열명2 INTEGER NOT NULL,
    열명3 VARCHAR(30),
    PRIMARY KEY(열명1, 열명2)
    );
    
    ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
    제약 이름 정의
    CREATE TABLE 테이블명 (
    열명1 INTEGER NOT NULL,
    열명2 INTEGER NOT NULL,
    열명3 VARCHAR(30),
    CONSTRAINT PK_sample PRIMARY KEY(열명1, 열명2)
    );

    아래의 예시에서 테이블 제약을 변경해보자.

    테이블 제약을 삭제 한 후, 2개의 열 모두 기본키 제약을 정의해보자.

    테이블 제약에서는 DROP 하부 명령으로 제약을 삭제할 수 있다.

    ALTER TABLE 테이블명 DROP PRIMARY KEY;

    열 no, a에 기본키 제약을 정의

    ALTER TABLE 테이블명 ADD PRIMARY KEY(열명1);

    아래에서는 no , a 두 가지 열에 기본키 제약을 정의하였다.

    현재 PK는 이전까지와는 달리 2가지 값을 지정한 상태이다.

    alter table ttttt_set add constraint pk_sample primary key(no, a);

     

    2가지 값을 지정한 이유는 복수의 열을 PK로 지정했을 때 데이터를 어떻게 다룰 수 있는지 알아보기 위함이다.

    현재 PK값은 유일한 값이며 NULL이 허용되지 않는 값이다.

    하지만 어떤게 no = 2에 해당하는 값을 추가로 가질 수 있을까? 

    복수의 열을 PK로 지정했기 때문이다.

    예전에 계속 해왔듯 하나의 열만 PK로 갖는 상황에서는 당연히 에러를 발생시켰겠지만, 복수의 열을 PK로 갖는 상황에서는

    no = 2, a = aaa / no =2 , a = ABC/ no = 2, a = ZXC 각각 키 전체로서는 중복이 되지 않는다고 간주하기 때문에 제약을 위반하지 않는 상황이 된다. 

    여기서 키 전체 (한쌍)과 동일한 데이터 값을 추가할 때는 당연히 에러가 발생한다.


    제약 명을 이용한 제약 삭제

    위에서 pk_sample이라는 제약 이름을 지정하여 PK 제약을 정의하였었다.

    아래와 같이 제약 이름을 이용하여 제약을 삭제한 예시이다.

    이처럼 제약의 이름을 붙히면 관리에 용이하기 하기 때문에 보통 제약 이름을 지정해서 사용해서 한다고 한다.

    표준 SQL에서는 아래와 같이 제약 이름으로 삭제할 수 있다.

    ALTER TABLE 테이블명 DROP CONSTRAINT pk_sample;

    MySQL에서는 테이블 당 PK는 반드시 하나만 설정할 수 있기에 아래와 같이 삭제가 가능하다.

    ALTER TABLE 테이블명 DROP PRIMARY KEY;

    728x90

    'Database' 카테고리의 다른 글

    SQL 테이블 작성, 삭제, 변경  (0) 2021.04.27
    SQL 데이터베이스 객체  (0) 2021.04.25
    SQL 상관 서브쿼리  (0) 2021.04.19
    SQL 서브쿼리_2  (0) 2021.04.14
    SQL 서브쿼리_1  (0) 2021.04.09
Designed by Tistory.