본문 바로가기
CS/DataBase

데이터베이스 첫걸음 정리 - 27장. 제약

by yongckim 2022. 9. 26.
728x90
반응형

테이블에 제약을 설정함으로써 저장될 데이터를 제한할 수 있습니다.

예를 들어 NOT NULL 제약은 NULL 값이 저장되지 않도록 제한합니다.

NOT NULL 제약외에도 기본키(Primary Key) 제약이나 외부참조(정합) 제약 등이 있습니다.

이 제약은 데이터베이스 설계에도 영향을 주는 중요한 개념입니다.

특히 기본키제약은 RDBMS에서 반드시 언급되는 사항이므로 추가나 삭제방법을 확실하게 알아두어야 합니다.

테이블 작성시 제약 정의

제약은 테이블에 설정하는 것입니다. CREATE TABLE로 테이블을 작성할 때 제약을 같이 정의합니다.

물론 ALTER TABLE로 제약을 지정하거나 변경할 수 있습니다.

이 때 NOT NULL 제약 등 하나의 열에 대해 설정하는 제약은 열을 정의할 때 지정합니다.

다음은 NOT NULL 제약과 UNIQUE 제약을 설정한 예입니다.

CREATE TABLE sample (
	a INTEGER NOT NULL,
	b INTEGER NOT NULL UNIQUE,
	c VARCHAR(30)
);

a 열에는 NOT NULL 제약, b열에는 NOT NULL 제약과 UNIQUE 제약이 걸려있습니다.

이 처럼 열에 대해 정의하는 제약을 “열 제약"이라 부릅니다.

이후 뒤에서 소개할 복수열에 의한 기본키 제약 처럼 한개의 제약으로 복수의 열에 제약을 설명하는 경우를 테이블 제약이라고부릅니다.

다음은 테이블에 테이블 제약을 정의하는 예시입니다.

CREATE TABLE sample(
	no INTEGER NOT NULL,
	sub_no INTEGER NOT NULL,
	name VARCHAR(30),
	PRIMARY KEY (no, sub_no)
);

제약에는 이름을 붙일 수 있습니다. 제약에 이름을 붙이면 나중에 관리하기 쉬워지므로 가능한 이름을 붙이는 것이 좋습니다.

제약 이름은 CONSTRAINT 키워드를 사용해서 지정합니다.

CREATE TABLE sample(
	no INTEGER NOT NULL,
	sub_no INTEGER NOT NULL,
	name VARCHAR(30),
	CONSTRAINT pkey_sample PRIMARY KEY (no, sub_no)
);

제약 추가

기존 테이블에도 나중에 제약을 추가할 수 있습니다.

이때 열 제약과 테이블 제약은 조금 다른 방법으로 추가합니다.

열 제약 추가

열 제약을 추가할 경우 ALTER TABLE로 열 정의를 변경할 수 있습니다. 기존 테이블을 변경할 경우에는 제약을 위반하는 데이터가 있는지 먼저 검사합니다.

만약 c열에 NULL 값이 존재한다면 ALTER TABLE 명령은 에러가 발생합니다.

다음은 c열에 NOT NULL 제약을 설정하는 예입니다.

ALTER TABLE sample MODIFY name VARCHAR(30) NOT NULL;

테이블 제약 추가

테이블 제약은 ALTER TABLE의 ADD 하부 명령으로 추가할 수 있습니다.

다음은 기본키 제약을 추가하는 예제입니다.

ALTER TABLE sample ADD CONSTRAINT pkey_sample PRIMARY KEY(name);

기본키는 테이블에 하나만 설정할 수 있습니다.

이미 기본키가 설정되어 있는 테이블에 추가로 기본키를 작성할 수는 없습니다.

또, 열 제약을 추가할 때와 마찬가지로 기존의 행을 검사해 추가할 제약을 위반하는 데이터가 있으면 에러가 발생합니다.

제약 삭제

열 제약의 경우 제약을 추가할 때와 동일하게 열 정의를 변경합니다.

다음은 name의 NOT NULL 제약을 삭제하는 ALTER TABLE의 예입니다.

ALTER TABLE sample MODIFY name varchar(30);

테이블 제약의 경우 ALTER TABLE의 DROP 하부명령으로 삭제할 수 있습니다.

삭제할 때는 제약명을 지정합니다

ALTER TABLE sample DROP PRIMARY KEY;

기본키

CREATE TABLE, ALTER TABLE을 통해 제약의 정의, 추가, 삭제에 대해 알아보았습니다.

NOT NULL 제약은 열 제약이며, 기존키 제약이 테이블 제약이라는 것도 알았습니다.

NOT NULL 제약의 경우 대상 열에 NULL 값이 존재하면 에러가 발생하고 제약이 설정되지 않습니다.

그렇다면 기본키 제약을 설정하기 위해서는 테이블은 어떤 조건을 만족해야 할까요?

지금부터 예시를 통해 기본키 제약의 개념에 관해 설명하겠습니다.

먼저, CREATE TABLE로 예제 테이블을 생성합니다.

CREATE TABLE sample(
	p INTEGER NOT NULL,
	a VARCHAR(30),
	CONSTRAINT pkey_sample PRIMARY KEY(p)
);

위의 테이블을 살펴보면 열 p가 sample 테이블의 기본키인 상태입니다. (참고로, 기본키로 지정할 열은 NOT NULL 제약이 설정되어야 합니다.)

기본키는 테이블의 행 한개를 특정할 수 있는 값입니다.

기본키 제약이 설정된 테이블에서는 기본키로 검색했을 때 복수의 행이 일치하는 데이터를 작성할 수 없습니다.

간단히 말하면 기본키로 설정된 열이 중복하는 데이터 값을 가지면 제약에 위반됩니다.

INSERT INTO sample VALUES(1, "one");
INSERT INTO sample VALUES(2, "two");
INSERT INTO sample VALUES(3, "three");

위와 같이 행을 추가하고 p 값으로 중복 값을 넣으면 다음과 같이 에러가 발생합니다.

INSERT INTO sample VALUES(2, "four");

이처럼 열을 기본키로 지정해 유일한 값을 가지도록 하는 구조가 바로 기본키 제약입니다.

행이 유일성을 필요로 한다는 의미로 “유일성 제약"이라고도 불립니다.

복수의 열로 기본키 구성하기

기본키를 구성하는 열은 복수여도 괜찮습니다.

단, 복수의 열을 기본키로 지정했을 경우 키를 구성하는 모든 열을 사용해서 중복하는 값이 있는지 없는지를 검사합니다.

예를들어, a열과 b열로 기본키를 지정했을 경우를 생각해봅시다.

a b
1 1
1 2
1 3
2 1
2 2

위와 같이 a열만 봤을때는 중복값이 있지만 b열이 다르면 키 전체로서는 중복하지 않는다고 간주되기 때문에 기본키 제약에 위반되지 않습니다.

만약 a와 b가 완전히 겹치는 데이터가 있는 경우에만 기본키 제약을 위반하게 됩니다.

정리

  • 테이블 및 열에 제약을 통해 저장될 데이터를 제한할 수 있습니다.
  • NOT NULL 제약이나 UNIQUE 제약 처럼 열에 거는 제약을 열 제약이라고 부릅니다.
  • 한개의 제약으로 복수의 열에 제약을 설명하는 경우를 테이블 제약이라고부릅니다.
  • 기존 테이블에 제약조건을 변경하고 싶을 경우 ALTER TABLE 명령을 사용할 수 있습니다.
  • 기본키는 테이블의 행 한개를 특정할 수 있는 값입니다.
  • 열을 기본키로 지정해 유일한 값을 가지도록 하는 구조가 바로 기본키 제약입니다.
  • 기본키를 구성하는 열은 복수의 열이어도 됩니다.
반응형