더북(TheBook)

③ 기본키

기본키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 키워드를 사용해서 생성해야 한다. 예를 들어, 샘플 스키마에 있는 job_history 테이블의 기본키는 employee_id와 start_date며, 테이블 DDL을 보면 CONSTRAINT PK_JOB_HISTORY PRIMARY KEY (EMPLOYEE_ID, START_DATE)로 생성했음을 확인할 수 있다. 이 때 employee_id + start_date의 조합이 유일(UNIQUE)해야 하고, 두 컬럼에 NULL은 들어갈 수 없다. 기본키로 사용할 수 있는 컬럼 개수는 최대 32개다.

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

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.