본문 바로가기
DB/Oracle

[SQL] 제약조건 CONSTRAINT

Writer mintparc 2019. 11. 2.

제약조건 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'); //오류

 

댓글