제약조건 CONSTRAINT
데이터가 손상되거나 원래의 의미를 잃지 않고 유지되게 하기 위해 제약조건을 사용할 수 있다.
제약조건 | 설명 |
NOT NULL | 해당 컬럼에 NULL 값이 들어갈 수 없다. |
UNIQUE | 해당 컬럼 값이 유일해야 한다. |
PRIMARY KEY | 각 행을 유일하게 식별할 수 있어야 한다. (기본키) |
CHECK | 해당 컬럼의 특정 조건을 항상 만족시켜야 한다. |
제약조건의 특징
- 이름으로 관리한다.
- 문자로 시작해서 길이는 30자까지 가능하다.
- 이름을 따로 지정하지 않으면 자동으로 생성된다.
- 생성시기
- 테이블 생성과 동시
- 테이블을 생성한 후
* 테이블 생성과 동시에 적용하는 것이 좋다.
NOT NULL
예를 들어 프리미어 리그 첼시 선수단 정보를 담은 TEAM_CHELSEA TABLE을 만든다고 가정하자. 테이블의 컬럼은 NAME, NUMBER, POSITION, BIRTH로 구성할 것이다. NAME컬럼과 NUMBER컬럼은 아무 값도 들어가지 않으면 안 된다. 이때 우리는 데이터를 입력할 때 NULL 값이 들어갈 수 없도록 제약 조건을 걸어줄 수 있다.
CREATE TABLE TEAM_CHELSEA (
NAME VARCHAR2(20) NOT NULL,
NUMBER NUMBER NOT NULL,
POSITION CHAR(3),
BIRTH DATE
);
UNIQUE
앞의 예제를 이어 나가보자. 팀에는 한 선수당 하나의 등번호가, 그리고 모든 선수의 등번호는 겹치지 않아야 한다.
이 경우 컬럼에 들어가는 데이터가 유일하도록 제약조건을 주면 된다.
CREATE TABLE TEAM_CHELSEA (
NAME VARCHAR2(20) NOT NULL,
NUMBER NUMBER UNIQUE,
POSITION CHAR(3)
BIRTH DATE
);
PRIMARY KEY 기본키
PRIMARY KEY는 기본키라고도 한다. 이것은 쉽게 말해 NOT NULL과 UNIQUE의 특징을 합쳐놓은 것이다. NULL 값이 들어갈 수 없으면서 들어가는 값이 중복되어선 안 된다. 그렇기 때문에 어떤 데이터(1 ROW)를 식별해주는 기능을 한다.
다시 예제로 돌아와서, 첼시팀의 등번호는 모든 선수에게 꼭 하나씩 부여되어야 하는 속성이며(NOT NULL), 등번호가 중복되어서는 안 된다.(UNIQUE) 이를 우리는 PRIMARY KEY로 정할 수 있다. 모든 선수들은 고유한 등번호를 하나씩 부여받고 이를 이용해서 각 선수를 식별할 수 있다.
CREATE TABLE TEAM_CHELSEA(
NAME VARCHAR2(20) NOT NULL,
NUMBER NUMBER PRIMARY KEY,
POSITION CHAR(3),
BIRTH DATE
);
FOREIGN KEY 외래키
외래키란 다른 테이블의 기본키를 참조해와서 데이터의 무결성을 유지하는 데 활용된다. 허용된 값(참조한 테이블 칼럼의 데이터)만을 현재 테이블에 저장할 수 있다.
CREATE TABLE LINEUP_CHELSEA(
NUMBER NUMBER REFERENCES TEAM_CHELSEA(NUMBER),
POSITION CHAR(3) NOT NULL
);
첼시가 LINEUP_CHELSEA 라는 테이블을 만들어서 다음 경기에 출전할 선수를 추려 선발 명단을 작성하려고 한다.
작성 시에 선수의 데이터를 잘못 넣는 실수를 방지하기 위해 FOREIGN KEY를 사용할 것이다. TEAM_CHELSEA 의 NUMBER를 참조해서 없는 값을 넣으려고 하면 오류를 발생시킬 것이다.
INSERT INTO LINEUP_CHELSEA VALUES(7, 'MF');
INSERT INTO LINEUP_CHELSEA VALUES(28, 'DF');
INSERT INTO LINEUP_CHELSEA VALUES(11, 'RW');
INSERT INTO LINEUP_CHELSEA VALUES(99, 'FW'); //오류
LINEUP_CHELSEA 테이블에 다음과 같이 선발 선수 명단을 넣을 때, TEAM_CHELSEA 테이블에 존재하지 않는 백넘버를 저장하려고 하면 오류가 발생한다.
예시를 그림으로 표현해보았다.
LINEUP_CHELSEA 테이블에 값을 넣으려고 할 때, TEAM_CHELSEA에 없는 백넘버인 99번은 들어가지 않는다.
CHECK
CHECK는 입력받을 값의 범위를 지정해준다.
NAME과 MARRIAGE 값을 저장해 줄 TEST 테이블을 만들었다. 이때 MARRIAGE 칼럼에는 Y 혹은 N 값 만을 저장할 수 있다.
CREATE TABLE TEST(
NAME VARCHAR2(20),
MARRIAGE CHAR(1) CHECK(MARRIAGE IN ('Y', 'N'))
);
INSERT INTO TEST VALUES ('PARK', 'N');
INSERT INTO TEST VALUES ('LEE', 'Y');
INSERT INTO TEST VALUES ('CHOI', 'Z'); //오류
댓글