본문 바로가기
BOOKS/MySQL

4. 제약 조건

by IT여행자 2022. 3. 1.
728x90

제약 조건이란 간단히 말하면 하자요인이 있는 데이터를 걸러내는 기능이라 볼 수 있다. 즉, 점수는 0~100 사이만 입력되게 한다던지, 글의 제목은 반드시 있어야 하고, 답글이 있는 경우 본문글만을 삭제하지 못하도록 만드는 기능이라 생각하면 될 것이다.

 

4.1. 제약 조건의 목적

  • 데이터의 무결성 유지 : 하자가 있는 데이터가 발생하지 않도록 하는것.
  • relation을 보다 견고하게 : 테이블 사이의 데이터 연결이 반드시 유지 되도록 하는것

 

4.2. 무결성 제약조건의 종류

 

제약 조건명 설명
PRIMARY KEY(PK) - NOT NULL, UNIQUE의 특성을 갖고 있고 테이블당 하나만 존재.
- 둘 이상의 컬럼을 묶어 하나의 PK를 선언할 수 있음.
- 자동으로 INDEX가 만들어진다.
FOREIGN KEY(FK) - 외래키. 자식테이블의 데이터가 존재했을 때 부모 테이블의 데이터가 삭제되거나 수정되는 것을 예방. ON CASCASE UPDATE나 ON CASCASE DELETE 옵션을 사용하여 부모 테이블의 데이터가 삭제되거나 수정되었을 때 자식 테이블의 데이터를 삭제하거나 수정할 수 있게 할수는 있다.
- 부모 테이블의 컬럼은 PK나 UNIQUE 제약 조건이 설정되어 있어야 한다.
NOT NULL - NULL 값을 허용하지 않는다. 컬럼 생성시 기본이 NULL이기 때문에 컬럼에 제약 조건을 수정할 때 ADD를 사용하지 않고 MODIFY를 사용한다.
UNIQUE - 하나의 NULL은 허용하고, 중복되지 않는 데이터를 유지하기 위해 사용됨.
- 자동으로 INDEX가 만들어진다.
CHECK - 허용되는 값을 일정하게 지정하거나 범위를 줄수 있다.
- MariaDB 10, Mysql 8 버전 이상부터 지원
DEFAULT - 입력되는 값이 NULL값일때 특정값이 입력값이 되도록 설정할 수 있다.
- 제약조건을 수정할 때 ADD를 사용하지 않고 MODIFY를 사용한다.

 

4.3. 제약조건 확인

 

데이터 베이스명을 information_schema로 변경한 뒤 작업한다.

USE information_schema
show tables
SELECT * FROM table_constraints

 

4.4. 제약 조건 설정하기

 

[TYPE 1]

컬럼을 지정하면서 제약 조건 설정하기

create table student(
  sno int primary key,
  mname varchar(20) not null,
  phone varchar(30) unique,
  address varchar(50) default ‘seoul’ ,
  gender varchar(2) check( gender in('f','m') ),
  zipcode int,
  score int check( score between 0 and 100),
  
  foreign key(zipcode) references member(sno) [on delete cascade] [on update cascade]
);

 

 

[TYPE 2]

컬럼을 모두 지정한 후 뒤에 제약 조건 설정하기

create table student(
  sno int ,
  mname varchar(20) not null,
  phone varchar(30),
  address varchar(50) default 'seoul',
  gender varchar(2),
  zipcode int,
  score int,

  constraint std_sno_pk primary key(sno),
  constraint std_gender check(gender in('f','m')),
  constraint std_phone_uk unique(phone),
  constraint std_zipcode_fk foreign key(zipcode) references member(sno)
  [on delete cascade] [on update cascade]
);

 

 

4.5. 테이블 생성 후 제약 조건 수정

 

[PRIMARY KEY]

 

추가 ALTER TABLE 테이블명 ADD [CONSTRAINT 제약조건명] PRIMARY KEY(컬럼명)
ALTER TABLE 테이블명 MODIFY COLUMN 필드명 필드타입 PRIMARY KEY
ALTER TABLE 테이블명 MODIFY COLUMN [CONSTRAINT 제약조건명]
PRIMARY KEY(필드명)
삭제 ALTER TABLE 테이블명 DROP PRIMARY KEY

 

[FOREIGN KEY]

 

추가 ALTER TABLE 테이블명 ADD CONSTRAINT 제약조건이름 FOREIGN KEY(컬럼명)
REFERENCES 부모 테이블명(PK 컬럼명)
[ON DELETE CASCADE] [ ON UPDATE CASCADE]
삭제 ALTER TABLE 테이블명 DROP FOREIGN KEY 제약 조건명

 

[NULL | NOT NULL]

 

수정 ALTER TABLE 테이블명 MODIFY COLUMN 컬럼명 자료형 [NULL OR NOT NULL]

 

* null과 not null 제약 조건은 ADD로 하지 않고 MODIFY로 수정한다. 따라서 DROP 을 하지 않고 NULL 또는 NOT NULL로 수정한다.

 

[UNIQUE]

 

추가 ALTER TABLE 테이블명 ADD CONSTRAINT 제약조건명 UNIQUE(컬럼명1, [컬럼명2…])
삭제 ALTER TABLE 테이블명 DROP INDEX 제약조건명
DROP INDEX 제약조건명 ON 테이블명

 

[CHECK]

 

추가 ALTER TABLE 테이블명 ADD CONSTRAINT 제약조건명 CHECK(조건)
삭제 ALTER TABLE 테이블명 DROP CONSTRAINT 제약 조건명

 

[DEFAULT]

 

추가 ALTER TABLE 테이블명 ALTER COLUMN 컬럼명 SET DEFAULT 값
삭제 ALTER TABLE 테이블명 ALTER COLUMN 컬럼명 SET DEFAULT NULL

 

* 제약조건 삭제시 오류가 발생한다면 외래키 제약조건 때문일 가능성이 높다. 따라서 외래키 제약조건을 먼저 삭제한 후 진행한다.

 

4.6. 제약 조건의 활성화 / 비활성화

 

설정된 제약 조건을 삭제하지 않고 임시로 활성화 비활성화를 통해 제약조건을 제어 할 수 있다.

 

활성화 ALTER TABLE 테이블명 ENABLE CONSTRAINT 제약조건
비 활성화 ALTER TABLE 테이블명 DISABLE CONSTRAINT 제약조건