본문 바로가기
Database

테이블 제약 조건(constraints)

by yj-data 2025. 6. 18.

테이블 제약 조건: 정확한 데이터만 저장할 수 있도록 설정하는 방법

  • 데이터를 입력받을 때 실행되는 검사 규칙
  • 관계형 데이터베이스는 테이블 간 참조 관계를 설정할 수 있음 (관계형 데이터베이스는 데이터의 무결성 유지를 위해 부모 테이블에 없는 데이터를 자식 테이블이 가질 수 없다)
  • CREATE문으로 테이블 생성 시 제약 조건 설정 가능
  • 이미 테이블이 생성되어 있는 경우 ALTER문으로 추가 가능
NOT NULL: NULL값 입력금지
UNIQUE: 중복된값 입력금지(NULL은 허용) / 여러개 열 가능 / 고유한 비클러스터형 인덱스(secondary 인덱스) 생성 /  FOREIGN KEY 제약의 참조대상이 됨 
PRIMARY KEY: NOT NULL + UNIQUE / 클러스터형 인덱스 생성됨(무조건) / 테이블 당 한개 
    * 클러스터형 인덱스의 특징은 정렬이 되어서 저장이 된다는 것 
FOREIGH KEY
CHECK: 조건으로 설정된값만 입력 허용 / 부호,숫자비교,문자비교 등 가능 / 해당 칼럼이 지정된 범위 밖의 값이 입력되는 것을 방지하기 위해 사용 
DEFAULT: 해당 열에 기본값 설정

 

CREATE 

CREATE TABLE table_name (
    id INT PRIMARY KEY,
    ssn INT NOT NULL,
    name VARCHAR(30) DEFAULT 'unknown',
    nickname VARCHAR(30) UNIQUE,
    dob INT CHECK(DOB >= 1900 AND DOB <= 2024), #DATE OF BIRTH 
    age INT DEFAULT 10,
    status INT CHECK(status in (1, 2, 3))
);


#FOR PRIMARY KEY, ALTERNATIVE WAYS
CREATE TABLE table_name (
    id INT,
    name VARCHAR(30),
    PRIMARY KEY(id)
);

CREATE TABLE table_name (
    id INT,
    name VARCHAR(30),
    CONSTRAINT pk_id PRIMARY KEY(id)
);

#FOR UNIQUE, ALTERNATIVE WAYS
CREATE TABLE table_name (
    id INT,
    name VARCHAR(30),
    UNIQUE(name)
);

CREATE TABLE table_name (
    id INT,
    name VARCHAR(30),
    CONSTRAINT unique_name UNIQUE(name)
);

#FOR CHECK, ALTERNATIVE WAYS
CREATE TABLE table_name (
    id INT,
    name VARCHAR(30),
    DOB INT,
    CONSTRAINT constraint_name CHECK(DOB >= 1900 AND DOB <= 2024) 
);

 

 

ALTER 

#EXISTING COLUMN
ALTER TABLE table_name
    MODIFY COLUMN column_name VARCHAR(30) NOT NULL;
    
ALTER TABLE table_name #pk지정
    ADD CONSTRAINT pk_id PRIMARY KEY(id);
    
ALTER TABLE table_name #unique컬럼지정 
    ADD CONSTRAINT unique_name UNIQUE(name);
    
ALTER TABLE table_name #unique컬럼지정 
    ADD CONSTRAINT CHECK(DOB >= 1900 AND DOB <= 2024);
    
#NEW COLUMN
ALTER TABLE table_name
    ADD column_name VARCHAR(30) NOT NULL;
    
#FOREIGN KEY
#CREATE TABLE parent_table(col_1 INT PRIMARY KEY);
#CREATE TABLE child_table(col_1 INT);
ALTER TABLE child_table
    ADD FOREIGN KEY(col_1) REFERENCES parent_table(col_1);
    
ALTER TABLE child_table
    ADD FOREIGN KEY(col_1) REFERENCES parent_table(col_1) ON DELETE;

 

DELETE / UPDATE(e.g. CASCADE)

ALTER TABLE child_table
    DROP CONTRAINT child_table_ibfk_1;
    
#외래키 비활성
SET FOREIGN_KEY_CHECKS=0;
#외래키 활성
SET FOREIGN_KEY_CHECKS=1;

ON DELETE # 참조되는 테이블값이 삭제될 경우 동작
ON UPDATE # 참조되는 테이블값이 수정될 경우 동작
    CASCADE # 참조하는 테이블에서도 삭제와 수정이 같이 이루어짐
    SET NULL # 참조하는 테이블의 데이터는 NULL로 변경
    NO ACTION # 참조하는 테이블의 데이터는 변경되지 않음
    SET DEFAULT # 참조하는 테이블의 데이터는 필드의 기본값으로 설정
    RESTRICT # 참조하는 테이블에 데이터를 삭제하거나 수정할 수 없음
    #빈번하게 수정되는 테이블에 이런 조건을 달아 놓는다면 성능에 부하가 걸릴 수 있음. 
    # 따라서 꼭 필요한 주요 테이블에 조건을 달아 놓을 것.
    # 조건이 안붙어있는 경우, 값 입력시에는 부모테이블 먼저, 삭제시에는 자식테이블 먼저해야 오류가 안생김

'Database' 카테고리의 다른 글

MYSQL 오류해결: Cannot connect to server...  (0) 2025.06.20
기타 mysql code (업데이트 중)  (0) 2025.06.18
모델링에 정답이 있나?  (0) 2025.06.17