본문 바로가기
SQL

SQL - 제약조건

by hyeon1016 2024. 11. 7.

제약조건

데이터의 무결성을 지키기 위한 것으로 데이터의 무결성은 데이터에 결함이 없다는 의미다. 예를 들어 구글 계정의 아이디가 중복되면 치명적인 문제가 발생할 수 있다. 이러한 결함이 없는 것을 데이터의 무결성이라고 표현한다.

제약 조건 설명
PRIMARY KEY UNIQUE + NOT NULL 제약 조건을 합친 것으로 유일한 값을 뜻한다.
FOREIGN KEY 현재 테이블의 컬럼 데이터가 다른 테이블의 PK에 존재하면 입력 가능하다.
UNIQUE 유일한 데이터를 뜻한다.
DEFAULT NULL을 입력한 경우 특정 값을 대신 입력한다.
NULL 값이 없어도 괜찮다.

 

 

기본 키 제약조건(PK)

PRIMARY KEY

기본 키에 입력되는 값은 복/변경될 수 없고, NULL값이 입력될 수 없다.

 

CREATE TABLE에서의 기본 키 제약조건

테이블을 생성할 때 컬럼의 데이터 타입 뒤에 PRIMARY KEY 예약어를 넣어주면 된다.

CREATE TABLE member(
    mem_id VARCHAR(8) PRIMARY KEY,
    mem_name VARCHAR(8) NOT NULL,
    height INT
);

 

테이블의 마지막에 PRIMARY KEY(컬럼 이름)을 넣어줘도 된다.

CREATE TABLE member(
    mem_id VARCHAR(8),
    mem_name VARCHAR(8) NOT NULL,
    height INT,
    PRIMARY KEY(mem_id)
);

 

ALTER TABLE에서 설정하는 기본 키 제약조건

만들어진 테이블을 수정하는 ALTER TABLE 구문을 사용해 컬럼에 기본 키 제약 조건을 추가할 수 있다.

CREATE TABLE member(
    mem_id VARCHAR(8),
    mem_name VARCHAR(8) NOT NULL,
    height INT
);

ALTER TABLE member 
    add CONSTRAINT
    PRIMARY KEY(mem_id);

 

기본 키에 이름 지정하기

PK에 별도의 이름을 지정해줄 수 있다.

CREATE TABLE member(
    mem_id VARCHAR(8),
    mem_name VARCHAR(8) NOT NULL,
    height INT,
    CONSTRAINT PRIMARY KEY PK_member_mem_id(mem_id)
);

 

외래 키 제약조건(FK)

FOREIGN KEY

두 테이블(PK-FK) 사이의 관계를 연결해준다. 외래 키가 설정된 열은 다른 테이블의 기본 키와 연결된다. 외래 키는 자유롭게 수정, 제거할 수 있지만 입력, 수정할 수 있는 값은 기본 키에 존재하는 값이어야만 한다.

 

CREATE TABLE에서의 외래 키 제약조건

'FOREIGN KEY(FK열_이름) REFERENCES 기준_테이블(PK열_이름)'로 PK - FK 관계를 설정할 수 있다. 

*PK - FK 관계를 설정할 때 컬럼의 이름이 기준이 되는 것이 아닌 데이터 타입이 기준이 된다.

 즉 데이터 타입이 같지 않으면 PK - FK 관계를 설정할 수 없다.

CREATE TABLE member(
    mem_id VARCHAR(8) PRIMARY KEY,
    mem_name VARCHAR(8) NOT NULL,
    height INT
);
CREATE TABLE buy(
    num INT AUTO_INCREMENT PRIMARY KEY,
    mem_id VARCHAR(8) NOT NULL,
    prod_name VARCHAR(6) NOT NULL,
    FOREIGN KEY(mem_id) REFERENCES member(mem_id)
);

 

ALTER TABLE에서 설정하는 외래 키 제약조건

기본 키 제약조건과 동일하게 컬럼에 외래 키를 설정할 수 있다.

CREATE TABLE buy(
    num INT AUTO_INCREMENT PRIMARY KEY,
    mem_id VARCHAR(8) NOT NULL,
    prod_name VARCHAR(6) NOT NULL
);
ALTER TABLE buy
    ADD CONSTRAINT
    FOREIGN KEY(mem_id)
    REFERENCES member(mem_id);

 

CASCADE

기존에 PK에서 값을 수정하거나 제거를 시도하면 오류가 발생했다. FK에 CASCADE를 제약 조건으로 설정하면 PK에서 값을 수정, 제거 했을 때 같이 변경된다.

CREATE TABLE buy(
    num INT AUTO_INCREMENT PRIMARY KEY,
    mem_id VARCHAR(8) NOT NULL,
    prod_name VARCHAR(6) NOT NULL
);
ALTER TABLE buy
    ADD CONSTRAINT
    FOREIGN KEY(mem_id) REFERENCES member(mem_id)

    ON UPDATE CASCADE
    ON DELETE CASCADE;

 

기준 테이블의 열(PK)이 변경될 경우

기준 테이블의 열(PK)의 값을 변경시키려 하면 일반적으로 오류가 발생한다.

PK - FK 관계가 설정되어 있기 때문에 PK를 변경, 제거를 시도할 경우 오류가 발생하는 것이 당연하다.

PK를 변경, 제거하면 FK도 같이 변경, 제거되는 기능을 지원 하는 것이 바로

ON UPDATE CASCADEON DELETE CASCADE다.

ALTER TABLE buy
    ADD CONSTRAINT
    FOREIGN KEY(mem_id) REFERENCES member(mem_id)
    ON UPDATE CASCADE
    ON DELETE CASCADE;

 

- ON UPDATE CASCADE와 ON DELETE CASCADE를 추가하고 변경, 제거를 시도하면 오류 없이 잘 실행된다.

 

PK - FK 테이블을 삭제하는 순서

FK 테이블을 먼저 제거하고 이후에 PK 테이블을 제거해야 오류가 발생하지 않는다.

 

고유 키 제약조건

UNIQUE

중복되지 않는 유일한 값을 입력해야하는 제약조건으로 기본 키와 다르게 고유 키는 NULL값을 허용하며 NULL값은 여러개가 입력되어도 문제가 없다. 또한 기본 키는 하나의 테이블에 하나만 존재할 수 있지만 고유 키는 하나의 테이블에 여러 개 존재할 수 있다.

* 검색에 사용할 컬럼에 많이 사용된다.

CREATE TABLE member(
    mem_id VARCHAR(8) PRIMARY KEY,
    mem_name VARCHAR(8) NOT NULL,
    height INT,
    email VARCHAR(30) NULL UNIQUE
);

 

 

체크 제약조건

CHECK()

입력되는 데이터가 특정 조건에 맞는지 점검하는 기능을 하며 조건에 맞지 않는 데이터는 입력되지 않는다.

CREATE TABLE member(
    mem_id VARCHAR(8) PRIMARY KEY,
    mem_name VARCHAR(8) NOT NULL,
    height INT CHECK(height>=100),
    phone VARCHAR(3) NULL,
    email VARCHAR(30) NULL UNIQUE
);
ALTER TABLE member
    ADD CONSTRAINT
    CHECK(phone IN('02', '010'));

 

- height 컬럼에 입력되는 값은 100과 같거나 커야한다.

- phone 컬럼에 입력되는 값은 '02', '010' 둘 중 하나여야한다.

 

기본값 정의

default

값이 입력되지 않았을 때 자동으로 입력될 값을 지정해 놓는 방법으로 'default'를 값으로 입력해도 지정된 값이 출력된다.

CREATE TABLE member(
    mem_id VARCHAR(8) PRIMARY KEY,
    mem_name VARCHAR(8) NOT NULL,
    height INT UNSIGNED NULL DEFAULT 100
);

 

- height 컬럼에 입력되는 값이 없거나 'default' 값을 입력하면 100이 출력된다.

 

널 값 허용, 비허용

NULL, NOT NULL

NULL 값을 허용하려면 NULL 허용하지 않으려면 NOT NULL을 사용한다.

* NULL은 아무것도 없다는 의미다.(공백, 0과 다름)

'SQL' 카테고리의 다른 글

SQL - 트리거  (0) 2024.11.11
SQL - 프로그래밍  (0) 2024.11.08
SQL - 뷰(VIEW)  (0) 2024.11.07
SQL - JOIN  (0) 2024.11.07
SQL - 데이터의 형식  (0) 2024.11.06