테이블 제약 조건: 정확한 데이터만 저장할 수 있도록 설정하는 방법
- 데이터를 입력받을 때 실행되는 검사 규칙
- 관계형 데이터베이스는 테이블 간 참조 관계를 설정할 수 있음 (관계형 데이터베이스는 데이터의 무결성 유지를 위해 부모 테이블에 없는 데이터를 자식 테이블이 가질 수 없다)
- 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 |