oracle

제약조건 _Primary key

꽃솜이 2021. 4. 1. 03:54

기본키 Primary key 라고도 하고 영어 그대로 ‘Primary key’라고 한다.

보통 테이블에 키를 생성했다라고 할 때, 이는 기본키를 의미한다.

 

기본키는 UNIQUE와 NOT NULL 속성을 동시에 가진 제약조건으로, 테이블 당 1개의 기본키만 생성할 수 있다.

 

컬럼명 데이터타입 PRIMARY KEY
혹은
CONSTRAINTS 제약조건명 PRIMARY KEY(컬럼명, ...)

오라클을 비롯한 여러 DBMS는 데이터 무결성을 보장하고 있는데,

데이터 무결성 DataIntegrity 이란 데이터의 정확성과 일관성을 유지한다는 뜻이다.

 

예를 들어, 사원 테이블(employees)에는 사번(employee_id)과 사원명(emp_name) 컬럼이 있는데

특정한 사람을 식별하려면 사번은 반드시 한 개이어야 한다.

 

만약 홍길동이란 사원의 사번이 두 개이거나 사번 자체가 들어가지 않고 데이터가 생성됐다면,

이 홍길동이란 사람을 정확히 식별할 수 있는 방법은 없다.

 

물론 퇴사했다가 다시 입사한 경우 사번이 2개가 생길 수도 있는데

이 경우에는 예전 사번이 있는 로우의 퇴사일자(retire_date) 컬럼에 데이터가 입력될 것이다.

 

이런 식으로 데이터 무결성을 DBMS에서 실질적으로 구현한 것이 바로 기본키(NOT NULL + UNIQUE)다.

 

CREATE TABLE ex2_8 (
	COL1   VARCHAR2(10) PRIMARY KEY,
	COL2   VARCHAR2(10)
);


결과
    table EX2_8이(가) 생성되었습니다.
SELECT constraint_name, constraint_type, table_name, search_condition
FROM user_constraints
WHERE table_name = 'EX2_8';


결과
    CONSTRAINT_NAME CONSTRAINT_TYPE TABLE_NAME  SEARCH_CONDITION
    --------------- --------------- ----------- ----------------
    SYS_C0011180    P               EX2_8

기본키는 constraint_type이 P(Primary key) 로 생성된다.

 

INSERT INTO ex2_8 VALUES ('', 'AA');


결과
    SQL 오류: ORA-01400: NULL을 ("ORA_USER"."EX2_8"."COL1") 안에 삽입할 수 없습니다.

기본키는 NOT NULL 속성이므로 NULL 입력이 불가능하다.

 

INSERT INTO ex2_8 VALUES ('AA', 'AA');


결과
    1개 행 이(가) 삽입되었습니다.
INSERT INTO ex2_8 VALUES ('AA', 'AA');


결과
    SQL 오류: ORA-00001: 무결성 제약 조건(ORA_USER.SYS_C0011180)에 위배됩니다.

값이 같은 데이터 역시 입력할 수 없다.

 

예제에서는 COL1 컬럼을 기본키로 잡았는데, 여러 컬럼을 하나의 기본키로 만들 수도 있다. (복합키)

이 경우에는 CONSTRAINTS 키워드를 사용해서 생성해야 한다.

 

예를 들면

CONSTRAINT PK_JOB_HISTORY PRIMARY KEY (EMPLOYEE_ID, START_DATE)

 

이 때 employee_id + start_date의 조합이 유일(UNIQUE)해야 하고, 두 컬럼에 NULL은 들어갈 수 없다.

기본키로 사용할 수 있는 컬럼 개수는 최대 32개다.

 

보통, 테이블을 만들 때 특수한 경우를 제외하고 기본키는 반드시 생성하는 것이 원칙이다.