[SQL] Constraint, 제약조건

제약조건을 어디다 쓰죠?{#제약조건을-어디다-쓰죠}

우리는 프로그램을 작성할 때, 올바른 데이터들만 입력받아야 한다.


올바른 데이터란 뭔가요?

프로젝트마다(업무 규칙에따라) 달라지겠지만,
보통 올바른 데이터란 서버에서 처리할 수 있는 데이터라고 생각한다.

서버에서 처리할 수 있는 데이터라고 통칭하기에는 A 프로젝트에서는 A 라는 값을 입력받아도 괜찮지만 B 프로젝트에서는 "Bb"값을 입력받으면 안 될 수도 있다.


그게 뭔 소리에요..?

프로젝트를 몇번 진행해보지 않은 사람들은 충분히 이해가 되지 않을 수 있다.

예를 들어,
A 프로젝트에서는 공지사항 등의 연락이 앱의 알람으로 보낼 수 있기 때문에 회원가입 시 고객의 전화번호가 굳이 필요하지 않아서 NULL을 허용한다.
반면,
B 프로젝트에서는 공지사항 등의 연락이 앱의 알람기능을 구현하지 않아서 문자로 알림을 보내야 하기 때문에 전화번호가 꼭 필요할 수 있다.
이럴 경우, IS NOT NULL이라는 제약조건을 설정해줘야 한다.


제약 조건은 어떤 것들이 있나요?

제약 조건의 종류

조건 이름 의미
NOT NULL 컬럼에 NULL 값을 허용할지?
UNIQUE 중복 값을 허용할지?
PRIMARY KEY '기본 키' 라고 부르는데, 이 제약조건은 NOT NULL + UNIQUE 를 동시에 만족해야 한다. 즉, NULL 값과 중복 값이 없어야 한다. 또한, 테이블 당 1개만 설정할 수 있다.
FOREIGN KEY 다른 테이블의 특정 값을 참조해야 하는지?
CHECK 설정된 값만 입력을 허용하고 나머지는 거부한다.

전지적 테이블 시점

FOREIGN KEY 에 대해 이야기 해보려고 한다!

여러분은 전지적 테이블 시점으로 봤을 때 FOREIGN KEY

  • FOREIGN KEY
  • REFERENCE KEY
    나뉜다는 것을 알고 계시는가?

예를 들어,

  • Student Table(id - PRIMARY KEY, password) (학생테이블)
  • StudentInfo Table(id - FOREIGN KEY, name, schoolNum) (학생정보 테이블)
    이 있다고 가정해보자.

학생 테이블의 id 입장에서는 자신을 참조하는 테이블이 있기 때문에 Reference Key라고 불리고, 학생정보 테이블에서는 학생 테이블의 id를 참조하여 생긴, 즉 자신의 테이블에서 생성된 데이터가 아니기 때문에 Foreign Key( 외래키 )라고 칭한다는 것을 유념해주시기 바란다.

 


어떻게 사용하는가?

이제 실제 사용되는 코드 형식을 살펴보자.

우선, 테이블이 생성될 때 제약 조건을 지정하는 방식과 테이블이 생성된 후 제약 조건을 부여 및 삭제 등의 수정을 하는 경우로 나뉜다.

CASE 1 : 테이블 생성 시, 제약조건 지정

Student 라는 테이블 명으로 아래의 키 조건을 만족하게 테이블을 생성하시오

  • schoolNumber : VARCHAR(7) / PRIMARY KEY
  • name : VARCHAR(8) / NOT NULL
  • age : NUMBER(2) / NOT NULL
  • major : VARCHAR(20) / ALLOW NULL

제약조건의 이름을 직접 정하는 경우

CREATE TABLE Student (
    schoolNumber VARCHAR(7)
        CONSTRANT std_schNum_pk PRIMARY KEY,
    name VARCHAR(8)
        CONSTRANT std_name_nn NOT NULL,
    age NUMBER,
        CONSTRAINT std_age_ag CHECK (age > 18 AND age < 150) NOT NULL,
    major VARCHAR(2)
        CONSTRANT std_major_mj 
)

제약조건의 이름을 자동으로 지정하도록 하는 경우

CREATE TABLE Student (
    schoolNumber VARCHAR(7) PRIMARY KEY,
    name VARCHAR(8) NOT NULL,
    age NUMBER CONSTRAINT std_age_ag CHECK (age > 18 AND age < 150) NOT NULL,
    major VARCHAR(2)
);

CASE 2 : 테이블 생성 후, 제약조건 수정

이제, 아까 생성한 Student 테이블을 통해, 수정을 진행해보겠다.

UNIQUE 설정/해제

  • UNIQUE 설정
ALTER TABLE Student     
ADD CONSTRAINT std_name_unique UNIQUE(name);
  • UNIQUE 해제
ALTER TABLE Student     
DROP CONSTRAINT std_name_unique;

이처럼 새로운 제약 조건을 추가할 때는 ALTER TABLEADD CONSTRAINT 명령을 사용하고, 제약 조건을 삭제할 때는 DROP CONSTRAINT 명령을 사용한다.

NULL <-> NOT NULL

  • NULL -> NOT NULL
ALTER TABLE Student     
MODIFY (age CONSTRAINT std_age_ag NOT NULL);
  • NOT NULL -> NULL
ALTER TABLE Student     
MODIFY (age CONSTRAINT std_age_ag NULL);

FOREIGN KEY 설정/해제

  • 설정
ALTER TABLE Student     
ADD CONSTRAINT fk_student FOREIGN KEY (other_table_column) 
REFERENCES OtherTable(other_column);
  • 해제
ALTER TABLE Student     
DROP CONSTRAINT fk_student;

PRIMARY KEY 설정/해제

  • 설정
ALTER TABLE Student     
ADD CONSTRAINT std_pk PRIMARY KEY (column1, column2);
  • 해제
ALTER TABLE Student     
DROP CONSTRAINT std_pk;

여기서 column1column2는 기존에 테이블에 존재하는 열 이름입니다. 새로운 제약 조건을 추가할 때는 ADD CONSTRAINT을 사용하고, 기존의 제약 조건을 삭제할 때는 DROP CONSTRAINT을 사용합니다.