기본 키 (Primary Key)란 무엇인가?
기본 키는 테이블 내의 각 행을 고유하게 식별하는 데 사용되는 하나 이상의 열(column)의 조합입니다. 다음은 기본 키의 중요한 특성입니다.
- 고유성: 테이블 내의 어떤 두 행도 동일한 기본 키 값을 가질 수 없습니다.
- NOT NULL 제약 조건: 기본 키를 구성하는 모든 열은 NULL 값을 가질 수 없습니다.
- 테이블 당 하나: 테이블에는 하나의 기본 키만 정의할 수 있습니다.
기본 키는 데이터 무결성을 유지하고, 테이블 간의 관계를 정의하며, 성능을 향상시키는 데 중요한 역할을 합니다.
기본 키 선택 시 고려 사항
테이블에 적합한 기본 키를 선택하는 것은 데이터베이스 설계의 중요한 단계입니다. 다음은 기본 키를 선택할 때 고려해야 할 몇 가지 주요 사항입니다.
- 고유성: 가장 중요한 기준은 선택한 열(또는 열의 조합)이 테이블 내의 모든 행에 대해 고유한 값을 보장해야 한다는 것입니다.
- 단순성: 기본 키는 가능한 한 단순해야 합니다. 여러 열로 구성된 복합 기본 키는 관리가 더 복잡하고 성능에 영향을 줄 수 있습니다.
- 안정성: 기본 키의 값은 자주 변경되지 않아야 합니다. 기본 키 값이 변경되면 관련된 모든 테이블에서 해당 값을 업데이트해야 하므로 성능 오버헤드가 발생합니다.
- 의미: 기본 키는 가능한 한 의미가 있어야 합니다. 즉, 기본 키의 값이 해당 행의 의미를 잘 나타내는 것이 좋습니다.
- 데이터 타입: 기본 키의 데이터 타입은 가능한 한 작고 효율적인 것이 좋습니다. 예를 들어, 숫자 타입은 문자열 타입보다 일반적으로 더 효율적입니다.
실무 예제 및 예시 코드
예제 1: 단일 열 기본 키
다음은 `EMPLOYEES` 테이블에 대한 기본 키를 정의하는 예입니다. `EMPLOYEE_ID` 열은 각 직원을 고유하게 식별하므로 기본 키로 적합합니다.
CREATE TABLE EMPLOYEES ( EMPLOYEE_ID NUMBER PRIMARY KEY, FIRST_NAME VARCHAR2(50), LAST_NAME VARCHAR2(50), EMAIL VARCHAR2(100), PHONE_NUMBER VARCHAR2(20), HIRE_DATE DATE, JOB_ID VARCHAR2(10), SALARY NUMBER, DEPARTMENT_ID NUMBER);
예제 2: 복합 기본 키
다음은 `ORDER_ITEMS` 테이블에 대한 복합 기본 키를 정의하는 예입니다. `ORDER_ID`와 `ITEM_ID` 열의 조합은 각 주문 항목을 고유하게 식별합니다.
CREATE TABLE ORDER_ITEMS ( ORDER_ID NUMBER, ITEM_ID NUMBER, PRODUCT_ID NUMBER, QUANTITY NUMBER, UNIT_PRICE NUMBER, PRIMARY KEY (ORDER_ID, ITEM_ID));
예제 3: 시퀀스(SEQUENCE)를 이용한 기본 키 생성
`EMPLOYEE_ID`를 자동으로 생성하기 위해 시퀀스를 사용할 수 있습니다. 이렇게 하면 기본 키의 고유성을 보장하고, 수동으로 값을 관리해야 하는 번거로움을 줄일 수 있습니다.
-- 시퀀스 생성CREATE SEQUENCE EMPLOYEES_SEQSTART WITH 1INCREMENT BY 1;-- 테이블 생성CREATE TABLE EMPLOYEES ( EMPLOYEE_ID NUMBER PRIMARY KEY, FIRST_NAME VARCHAR2(50), LAST_NAME VARCHAR2(50), EMAIL VARCHAR2(100));-- 트리거 생성CREATE OR REPLACE TRIGGER EMPLOYEES_BI BEFORE INSERT ON EMPLOYEES FOR EACH ROWBEGIN SELECT EMPLOYEES_SEQ.NEXTVAL INTO :NEW.EMPLOYEE_ID FROM DUAL;END;
위 코드에서 `EMPLOYEES_SEQ` 시퀀스는 새로운 직원이 추가될 때마다 자동으로 `EMPLOYEE_ID` 값을 생성합니다.
실행 결과 예시
위의 테이블 생성 후, 데이터 삽입을 시도할 경우:
INSERT INTO EMPLOYEES (FIRST_NAME, LAST_NAME, EMAIL) VALUES ('길동', '홍', 'gildong.hong@example.com');INSERT INTO EMPLOYEES (FIRST_NAME, LAST_NAME, EMAIL) VALUES ('나리', '김', 'nari.kim@example.com');SELECT * FROM EMPLOYEES;
결과는 다음과 같습니다.
EMPLOYEE_ID FIRST_NAME LAST_NAME EMAIL----------- ----------- ----------- ---------------------------- 1 길동 홍 gildong.hong@example.com 2 나리 김 nari.kim@example.com
주의사항
- 데이터 타입 호환성: 기본 키로 사용할 열의 데이터 타입은 관계를 맺는 다른 테이블의 외래 키(Foreign Key) 열과 호환되어야 합니다.
- 인덱스: 오라클은 기본 키 제약 조건을 정의할 때 자동으로 고유 인덱스를 생성합니다. 하지만, 성능을 위해 필요에 따라 추가적인 인덱스를 생성하는 것을 고려할 수 있습니다.
- 복합 키의 순서: 복합 키를 구성하는 열의 순서는 성능에 영향을 줄 수 있습니다. 일반적으로 가장 자주 사용되는 열을 먼저 지정하는 것이 좋습니다.
결론
오라클 데이터베이스에서 테이블의 기본 키를 선택하는 것은 신중한 고려가 필요한 중요한 작업입니다. 고유성, 단순성, 안정성, 의미, 데이터 타입과 같은 요소를 고려하여 적합한 기본 키를 선택하면 데이터 무결성을 유지하고, 효율적인 데이터베이스 설계를 구축하며, 성능을 향상시킬 수 있습니다.