DBMS/DataBase

[DataBase] MySQL 제약 조건(constraint)

code-mo 2023. 1. 12. 07:30
728x90
1. 제약조건을 관리하기 위한 이름으로 제약조건을 삭제하거나 일시적으로 중지하거나 하는 작업을 할 때 필요하다.
2. 제약조건명 자체는 필수적인 요소이지만 직접 정의하는 것은 옵션이다.
3. 제약조건명은 스키마 범위에서 고유한 이름값을 가져야 한다.
4. 제약조건명을 명시하지 않는 경우 DB시스템에서 자동으로 생성해주며 이름값은 내용을 알아보기 어렵다.
5. 제약조건명을 작성하는 고유한 규칙이 정해져 있지는 않지만 보통 '테이블명_칼럼명_제약조건 종류'의 형태로
    작성하는 경우 적용 위치나 종류도 파악하기 쉽다.
6. 제약조건명을 생략하는 경우 CONSTRAINT 키워드도 같이 생략해야 한다.
7. 테이블 레벨, 컬럼 레벨 선언을 할 수 있다.
8. 테이블 레벨로 작성하는 경우 제약조건이 적용될 컬럼의 이름을 제약조건에 작성해야 한다.

 

1. NOT NULL

1. NOT NULL 제약조건 설정 시 해당 컬럼에는 꼭 데이터를 입력해야 함.
2. 컬럼 레벨의 선언만 가능하다.
1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE test1 (
    id         INT(10)
        CONSTRAINT t1_id_nn NOT NULL,
    name       VARCHAR(30)
        CONSTRAINT t1_name_nn NOT NULL,
    job        VARCHAR(20),
    email      VARCHAR(20),
    phone      VARCHAR(20)
        CONSTRAINT t1_ph_nn NOT NULL,
    start_date DATE
);
cs

 

2. UNIQUE

1. 컬럼의 입력값에 고유한 값의 입력만 허용하는 제약조건
2. NULL값은 중복으로 취급하지 않아 NULL이 여러 개 생길 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE TABLE test2 (
    id         INT(10)
        CONSTRAINT t2_id_nn NOT NULL
        CONSTRAINT t2_id_uk UNIQUE,
    name       VARCHAR(30)
        CONSTRAINT t2_name_nn NOT NULL,
    job        VARCHAR(20),
    email      VARCHAR(20),
    phone      VARCHAR(20)
        CONSTRAINT t2_ph_nn NOT NULL
        CONSTRAINT t2_ph_uk UNIQUE,
    start_date DATE,
    CONSTRAINT t2_email_uk UNIQUE ( email )
);
cs

 

3. PRIMARY KEY

1. 테이블을 대표하는 컬럼에 설정하는 제약조건으로 NOT NULL과 UNIQUE 제약조건의 성질을 같이 가지고 있다.
2. 테이블 당 한 번만 사용이 가능
3. UK, PK의 제약조건을 설정한 컬럼에는 INDEX가 자동 생성되면서 WHERE절의 조건식에 사용되는 경우 쿼리 구문의     성능이 높아진다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
--컬럼레벨 선언
CREATE TABLE test3 (
    id         INT(10)
        CONSTRAINT t3_id_pk PRIMARY KEY,
    name       VARCHAR(30)
        CONSTRAINT t3_name_nn NOT NULL,
    job        VARCHAR(20),
    email      VARCHAR(20),
    phone      VARCHAR(20)
        CONSTRAINT t3_ph_nn NOT NULL
        CONSTRAINT t3_ph_uk UNIQUE,
    start_date DATE,
    CONSTRAINT t3_email_uk UNIQUE ( email )
);
 
--테이블레벨 선언
CREATE TABLE test3 (
    id         INT(10),
    name       VARCHAR(30)
        CONSTRAINT t3_name_nn NOT NULL,
    job        VARCHAR(20),
    email      VARCHAR(20),
    phone      VARCHAR(20)
        CONSTRAINT t3_ph_nn NOT NULL
        CONSTRAINT t3_ph_uk UNIQUE,
    start_date DATE,
    CONSTRAINT t3_email_uk UNIQUE ( email ),
    CONSTRAINT t3_id_pk PRIMARY KEY ( id )
);
cs

 

4. FOREIGN KEY

1. 같은 테이블 또는 외부 테이블에서 고유한 값을 가지는 특정 컬럼(PK, UK)의 값을 참조하는 제약조건
2. 외래 키가 적용된 컬럼에는 참조하고 있는 컬럼이 가지고 있지 않은 값은 입력이 불가능하다.
1
2
3
4
5
6
7
8
CREATE TABLE test_fk (
    id_fk    INT(10)
        CONSTRAINT tfk_id_fk -- ← 컬럼 레벨의 외래키 제약조건 선언
            REFERENCES test3 ( id ), -- test3의 id컬럼을 참조
    email_fk VARCHAR(20),
    CONSTRAINT tfk_email_fk FOREIGN KEY ( email_fk ) -- ← 테이블 레벨의 외래키 제약조건 선언 
        REFERENCES test3 ( email ) -- test3의 email컬럼을 참조
);
cs

 

5. CHECK

1. 컬럼의 값을 어떤 특정 범위로 제한하는 제약조건
1
2
3
4
CREATE TABLE test_ck (
    numb INT(5),
        CONSTRAINT tck_numb_ck CHECK ( numb IN ( 13579 ) )
);
cs

 

6. AUTO_INCREMENT

1. PK(Primary key)를 정수 값으로 겹치지 않게 자동으로 증가시키기 위해 사용하는 제약조건
2. PK(Primary key)의 옵션
1
2
3
4
CREATE TABLE test1 (
    userno INT(10AUTO_INCREMENT PRIMARY KEY,
    userid VARCHAR(30NOT NULL
);
cs

 

AUTO_INCREMENT 초기화
주의 : 테이블에 새로 시작할 값보다 높은 값이 있으면 안 됨
1
ALTER TABLE test1 AUTO_INCREMENT = 1
cs

 

7. DEFAULT

1. 데이터를 입력하지 않아도 Default라고 값을 명시하면 기본값이 들어감
1
2
3
4
5
CREATE TABLE class7 (
     userno INT(10AUTO_INCREMENT PRIMARY KEY,   
     userid VARCHAR(30NOT NULL,
     use_yn INT(10DEFAULT 1 
);
cs