http://www.tcpschool.com/mysql/mysql_constraint_notNull
제약 조건
테이블을 생성할 때 NOT NULL이라거나 PRIMARY KEY 같은 제약조건을 달아줬던게 기억이 난다.
이렇게 제약조건을 거는 이유는 데이터의 무결성을 지키기 위해서라고 한다.
앞서 기본 문법에서 스터디했듯이 CREATE문으로 테이블을 생성할 때나, ALTER문으로 필드를 추가할 때 설정할 수 있다.
MySQL에서 사용할 수 잇는 제약 조건은 다음과 같다.
- NOT NULL
- UNIQUE
- PRIMARY KEY
- FOREIGN KEY
- DEFAULT
NOT NULL
컬럼에 값을 비워놓을 수 없게 한다.
즉, 이 제약 조건이 설정된 필드는 무조건 데이터를 가지고 있어한다.
-
TCPSchool 자료에서는 NOT NULL이어도 INSERT문으로 데이터를 저장할 때 필드를 생략할 수 있다고 하는데, 다른 제약조건 없이 DEFALUT값이 null인 데이터를 저장하려고 하면 에러가 뜬다.
UNIQUE
UNIQUE는 뜻과 같이 컬럼을 유일한 값으로 설정하는 제약 조건이다.
이 조건이 걸리면 해당 컬럼은 중복된 값을 저장할 수 없다.
또 CREATE문으로 테이블을 생성하거나 ALTER문으로 컬럼을 변경할 때 [CONSTRAINT 제약조건이름]을 사용하면 해당 제약조건에 이름을 설정할 수도 있다.
CONSTRAINT 사용법은 다음과 같다.
CREATE TABLE 테이블명
(
컬럼명 컬럼타입,
...,
CONSTRAINT 제약조건이름 UNIQUE (필드이름)
)
PRIMARY KEY (PK)
PIRMARY KEY는 NOT NULL과 UNIQUE의 특징을 모두 갖는 제약 조건이다.
따라서 이 제약 조건이 설정된 필드는 NULL을 가질 수 없고, 중복되는 값도 가질 수 없다.
UNIQUE와 다른 점은 UNIQUE는 한 테이블에서 여러 컬럼에 설정할 수 있지만 PIRMARY KEY는 한 테이블당 한 컬럼에만 설정할 수 있다는 것이다.
이러한 PRIMARY KEY 제약 조건은 테이블의 데이터를 쉽고 빠르게 찾도록 도와주는 역할을 한다. 고마워 따봉 PRI야!
참고로 PRIMARY KEY를 ALTER문으로 추가할 때, 추가하려는 컬럼에는 NOT NULL 조건이 설정되어 있어야한다!
또, MySQL에서는 INT 작업이 빠르기 때문에 PK는 INT형으로 지정하는 것이 좋다고 한다.
보통은 id를 PK로 설정하고 자동으로 1씩 증가하는 값을 추가해주는 AUTO_INCREMENT를 함께 사용하는 것 같다.
+
<참고>
PK가 있어야하는 이유는 PK가 없으면 일관성 없는 데이터가 반복적으로 쌓일 수 있기 때문에 쿼리 속도가 느리고, 원하지 않는 정보 조회 결과를 가져올 수 있기 때문이다.
관계형 데이터베이스에서는 반드시 각 행이 고유하게 식별되어야 한다.
이 규칙을 위반하면 더 이상 관계형이 아니며 데이터에서 모호함이 생길 수 있다.
PK의 조건은 다음과 같다
- 유일한 값을 가져야한다 (UNIQUE)
- NULL 값을 가질 수 없다. (NOT NULL)
- 변경될 수 있는 경우가 없어야 한다.
FOREIGN KEY
외래 키로 불리는 FOREIGN KEY는 한 테이블을 다른 테이블과 연결해주는 역할을 한다.
왜래 키가 설정된 테이블에 데이터를 입력하면 기준이 되는 테이블의 내용을 참조해서 데이터가 입력된다.
즉, FOREIGN KEY 제약 조건은 하나의 테이블을 다른 테이블에 의존하게 만든다.
...무슨 말인지 이해가 잘 안가니 이번엔 예시로 살펴보자
CREATE TABLE 테이블이름
(
컬럼명 컬럼타입,
...,
FOREIGN KEY (컬럼명)
REFERENCES 테이블명 (컬럼명)
)
FOREIGN KEY는 다른 테이블을 참조한다고 했으니 참조할 테이블명을 명시해줘야하는데 이는 REFERENCES 키워드 다음에 명시해주면 된다.
user 테이블과 FOREIGN KEY를 가진 새로운 테이블을 가지고 실습해보자
user 테이블
test 테이블 생성
CREATE TABLE test
(
id INT,
parent_id INT,
FOREIGN KEY (parent_id)
REFERENCES user(id) ON UPDATE CASCADE
);
user 테이블의 id 컬럼과 test 테이블의 parent_id 컬럼이 FOREIGN KEY로 연결되었다.
이제 user 테이블의 id 컬럼이 변경되면 같은 값의 parent_id 컬럼도 같이 변경된다.
물론 위에서 정리했듯이 PK로 지정된 id는 변경되지 않아야한다!! 하지만 예제로 공부하는 중이니 예외로 치도록 한다.
user 테이블에 새로운 데이터를 추가하고
test 테이블에서 FOREIGN KEY로 연결된 parent_id에 새로 추가된 데이터 id와 같은 값을 추가해주었다.
그리고 ALTER문으로 user 테이블의 id = 12의 값을 수정해보면
test 테이블도 함께 수정되는 걸 확인할 수 있다.
FOREIGN KEY로 제약 조건을 설정할 때, 참조하고 있는 테이블의 동작을 미리 설정할 수도 있는데,
ON DELETE와 ON UPDATE 키워드를 사용하면 된다.
위에서 test 테이블을 생성할 때 함께 적어논 것처럼 사용이 가능하다.
이때 설정할 수 있는 동작은 다음과 같다.
키워드 | 설명 |
CASCADE | 참조되는 테이블에서 데이터를 삭제하거나 수정하면, 참조하는 테이블에서도 삭제와 수정이 같이 이루어진다. |
SET NULL | 참조되는 테이블에서 데이터를 삭제하거나 수정하면, 참조하는 테이블의 데이터는 NULL로 변경된다 |
NO ACTION | 참조되는 테이블에서 데이터를 삭제하거나 수정해도, 참조하는 테이블의 데이터는 변경되지 않는다. |
SET DEFAULT | 참조되는 테이블에서 데이터를 삭제하거나 수정하면, 참조하는 테이블의 데이터는 필드의 기본값으로 설정된다. |
RESTRICT | 참조하는 테이블에 데이터가 남아 있으면, 참조되는 테이블의 데이터를 삭제하거나 수정할 수 없다. |
DEFAULT
DEFAULT 제약 조건은 해당 필드의 기본값을 설정할 수 있게 해준다.
해당 제약 조건을 명시하지 않으면 DEFAULT값은 NULL로 설정되며, DEFAULT 조건을 설정해놓은 후 INSERT문을 사용할 때 해당 컬럼을 명시하지 않으면 자동으로 DEFAULT값을 저장한다.
더 다양한 제약 조건이 있는 거 같은데 TCPSchool에는 이렇게 5가지만 기술되어있다.
오늘도 정리 끝! 고생한 나에게 박수!
'Study > Database' 카테고리의 다른 글
[MySQL] INDEX (0) | 2022.03.07 |
---|---|
[MySQL] 다중 테이블 연산: JOIN, UNION, 서브쿼리 (0) | 2022.03.03 |
[MySQL] 연산자와 함수 (0) | 2022.03.01 |
[MySQL] 타입: 숫자, 문자열, 날짜와 시간 (0) | 2022.03.01 |
[MySQL] MySQL문법: 2 (0) | 2022.02.27 |