제약조건을 어디다 쓰죠?{#제약조건을-어디다-쓰죠}
우리는 프로그램을 작성할 때, 올바른 데이터들만 입력받아야 한다.
올바른 데이터란 뭔가요?
프로젝트마다(업무 규칙에따라) 달라지겠지만,
보통 올바른 데이터
란 서버에서 처리할 수 있는 데이터라고 생각한다.
서버에서 처리할 수 있는 데이터
라고 통칭하기에는 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 TABLE
에 ADD 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;
여기서 column1
과 column2
는 기존에 테이블에 존재하는 열 이름입니다. 새로운 제약 조건을 추가할 때는 ADD CONSTRAINT
을 사용하고, 기존의 제약 조건을 삭제할 때는 DROP CONSTRAINT
을 사용합니다.
'데이터베이스_Database > SQL' 카테고리의 다른 글
[SQL] 제약 조건 DISABLE (0) | 2024.04.14 |
---|---|
[SQL] FOREIGN KEY와 CASCADE?(ON DELETE / ON UPDATE) (0) | 2024.04.14 |
[SQL]MySQL Oracle_SQL의 날짜 포맷 (2) | 2023.12.03 |
[Oracle SQL][프로그래머스_131537] 오프라인/온라인 판매 데이터 통합하기 (0) | 2023.12.03 |
[SQL]UNION, UNION ALL 차이 (0) | 2023.12.03 |