본문 바로가기

DEVELOPMENT/SQL

[SQL] 제약조건

테이블 작성시 제약 정의

 

CREATE TABLE로 테이블을 작성할 때 제약을 같이 정의한다. 물론 ALTER TABLE로 제약을 지정하거나 변경할 수 있다.

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

-- 테이블 열에 제약 정의하기
CREATE TABLE sample1 (
 a INTEGER NOT NULL,
 b INTEGER NOT NULL UNIQUE,
 c VARCHAR(30)
);

이처럼 열에 대해 정의하는 제약을 '열 제약'이라 부른다.

'복수열에 의한 기본키 제약'처럼 한 개의 제약으로 복수의 열에 제약을 설명하는 경우를 '테이블 제약'이라 부른다.

-- 테이블에 '테이블 제약' 정의하기
CREATE TABLE sample1 (
 no INTEGER NOT NULL,
 sub_no INTEGER NOT NULL,
 name VARCHAR(30),
 PRIMARY KEY (no, sub_no)
);

 

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

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

-- '테이블 제약'에 이름 붙이기
CREATE TABLE sample1 (
 no INTEGER NOT NULL,
 sub_no INTEGER NOT NULL,
 name VARCHAR(30),
 CONSTRAINT pkey_sample PRIMARY KEY (no, sub_no)
);

 

 

제약 추가

 

1. 열 제약 추가

열 제약을 추가할 경우 ALTER TABLE로 열 정의를 변경할 수 있다. 기존 테이블을 변경할 경우에는 제약을 위반하는 데이터가 있는지 먼저 검사한다. 만약 c 열에 NULL 값이 존재한다면 ALTER TABLE 명령은 에러가 발생한다.

-- c열에 NOT NULL 제약 걸기
ALTER TABLE sample1 MODIFY c VARCHAR(30) NOT NULL;

 

2. 테이블 제약 추가

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

-- 기본키 제약 추가하기
ALTER TABLE sample1 ADD CONSTRAINT pkey_sample1 PRIMARY KEY(a);

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

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

 

 

제약 삭제

 

테이블 제약은 나중에 삭제할 수도 있다. 열 제약의 경우, 제약을 추가할 때와 동일하게 열 정의를 변경한다. 

-- 열 제약 삭제하기
ALTER TABLE sample1 MODIFY c VARCHAR(30);

-- 테이블 제약 삭제하기
ALTER TABLE sample1 DROP CONSTRAINT pkey_sample1;
ALTER TABLE sample1 DROP PRIMARY KEY;

 

 

기본키

 

기본키는 테이블의 행 한 개를 특정할 수 있는 검색키이다.

기본키 제약이 설정된 테이블에서는 기본키로 검색했을 때 복수의 행이 일치하는 데이터를 작성할 수 없다. 간단히 말하면, 기본키로 설정된 열이 중복하는 데이터 값을 가지면 제약에 위배된다.

이처럼 열을 기본키로 지정해 유일한 값을 가지도록 하는 구조가 바로 기본키 제약이다. 행이 유일성을 필요로 한다는 다른 의미에서 '유일성 제약'이라 불리는 경우도 있다.

기본키로는 NULL 값이 허용되지 않는다. 또한 기본키를 구성하는 열은 복수라도 상관없다. 복수의 열을 기본키로 지정했을 경우, 키를 구성하는 모든 열을 사용해서 중복하는 값이 있는지 없는지를 검사한다.

 

 

 

 

 

'DEVELOPMENT > SQL' 카테고리의 다른 글

[SQL] 뷰(VIEW)  (0) 2023.05.31
[SQL] 인덱스  (0) 2023.05.31
[SQL] 테이블 작성/삭제/변경  (0) 2023.05.30
[SQL] 상관 서브쿼리  (0) 2023.05.30
[SQL] 서브쿼리  (0) 2023.05.30