본문 바로가기
CS/DB

제약 (Constraint)

by 넬준 2022. 8. 14.

 

주로 열에 저장되는 데이터들을 제어하는 규칙을 정의하는 것을 제약이라고 한다.

제약은 데이터의 무결성을 유지하기 위해 필요하다.

 

데이터의 정확성, 일관성을 유지하는 것을 데이터의 무결성이 유지된다고 생각하면 된다.

데이터의 무결성은 데이터의 가치, 신뢰성면에서 꼭 필요한 속성이다.

 

제약은 컬럼 레벨 테이블 레벨로 테이블 생성 시 줄 수 있다.

 

제약의 종류는 다음과 같다.

 

  • NOT NULL
  • UNIQUE
  • PRIMARY KEY
  • FOREIGN KEY
  • CHECK
  • DEFAULT

 

NULL CONSTRAINT

 

NOT NULL 제약은 특정 열이 NULL값을 가지지 못하도록 하는 제약이다.

 

CREATE TABLE student (
...,
student_name VARCHAR(20) NOT NULL,
student_age INTEGER,
...);

 

다음과 같이 NULL 제약을 추가 / 삭제할 수 있다.

 

ALTER TABLE student 
MODIFY student_name VARCHAR(30),
MODIFY student_age INTEGER NOT NULL;

student_name 열은 NULL이 허용되고, student_age 열은 NULL을 허용하지 않게 됐다.

 

UNIQUE

 

특정 열(하나 이상)안에서 중복된 값을 가지지 못하게 하는 제약이다.

 

CREATE TABLE student (
...,
school_name VARCHAR(30) NOT NULL UNIQUE,
student_age INTEGER,
...);

 

다음과 같이 나중에 추가할 수 있다.

 

ALTER TABLE student 
MODIFY student_age INTEGER UNIQUE;

 

또한, 여러 열을 묶어서 UNIQUE 제약을 줄 수도 있다.

 

ALTER TABLE student
ADD CONSTRAINT unq_constraint UNIQUE(school_name, stduent_age);

 

'CONSTRAINT 제약명'은 설정하고자 하는 제약에 이름을 붙이기 위한 것이다.

 

위 커리는 school_name, student_age에 같이 UNIQUE제약을 줬다.

이 경우는 school_name 열과 student_age 열 하나의 묶음으로 생각해야 한다.

다시 말해, school_name 열의 값과 student_age 열의 값을 합쳐서 봤을 때 중복된 값이 없어야 한다.

 

school_name student_age
A중학교 14
A중학교 15

 

위와 같은 데이터가 있다고 한다면,

school_name 열로 봤을 땐 중복된 값이 존재하지만 각각의 student_age 열의 값은 다르기 때문에

위에서 지정한 unq_constraint 제약을 위반하지 않는다.

 

DEFAULT

데이터에 특정한 값이 지정되지 않은 경우 기본적으로 입력되는 값을 제약한다.

 

CREATE TABLE student (
..., 
student_address VARCHAR(30) DEFAULT '대한민국' NOT NULL,
student_age INTEGER NOT NULL,
...);

DEFAULT가 생략되면 각 자료형에 정해진 기본값이 설정된다.

 

다음과 같이 DEFAULT 제약을 추가 / 삭제할 수 있다.

 

ALTER TABLE student 
MODIFY student_age INTEGER DEFAULT 0 NOT NULL;

 

ALTER TABLE student 
ALTER student_address DROP DEFAULT;

 

CHECK

CHECK 제약은 작성한 조건에 맞는 데이터 값을 저장하도록 하는 제약이다.

 

CREATE TABLE student (
...,
student_age INTEGER DEFAULT 0 NOT NULL
CONSTRAINT ch_constraint CHECK (stduent_age > 0),
...,
school_name VARCHAR(30) 
CHECK (school_name IN ('a중학교', 'b중학교', 'c중학교'),
...);

 

student_age 열에는 0보다 큰 값만 저장할 수 있고,

school_name 열에는 a중학교, b중학교, c중학교 값만 저장할 수 있다.

 

 

 

PRIMARY KEY와 FOREIGN KEY는 따로 상세하게 추후 작성할 예정

 


참조

https://www.w3resource.com/mysql/creating-table-advance/constraint.php

https://injun379.tistory.com/9

'CS > DB' 카테고리의 다른 글

(MySQL) INNER JOIN  (0) 2022.08.12
인덱스  (0) 2021.12.06
DELETE / TRUNCATE / DROP 비교  (0) 2021.12.04
테이블 생성 / 삭제 / 변경  (0) 2021.12.04
데이터베이스 계층 구조  (0) 2021.12.04

댓글