개발 지식/[DBMS] Oracle

[Oracle] 제약 조건(3) - 기본 키(PRIMARY KEY)

devGSP 2022. 6. 25. 08:00
반응형
이 게시물은 Database GUI Oracle SQL Developer의 아래 버전 정보를 기준으로 작성되었습니다.

Java(TM) 플랫폼 : 1.8.0_321
Oracle IDE : 4.1.5.21.78

 

기본 키(PRIMARY KEY)

 

설명

 

PRIMARY KEY(이하 PK)는 지정한 열이 유일한 값이면서 NULL을 허용하지 않는 제약 조건이다. 테이블에 하나만 지정 가능하다. 이는 PK가 하나라는 의미이며, PK를 구성하는 열은 여러 개일 수 있다는 의미이다.

 

문법

 

인라인(inline) 제약 조건 정의

 

-- 제약 조건 이름 미지정

CREATE TABLE [테이블명] (
  [열이름] [자료형] PRIMARY KEY,
  (...)
);

 

-- 제약 조건 이름 지정

CREATE TABLE [테이블명] (
  [열이름] [자료형] CONSTRAINT [제약조건 이름] PRIMARY KEY,
  (...)
);

 

 

아웃오브라인(out-of-line) 제약 조건 정의

 

-- 제약 조건 이름 미지정

CREATE TABLE [테이블명] (
  [열이름] [자료형],
  (...)

  PRIMARY KEY ([열이름]),
);

 

-- 제약 조건 이름 지정

CREATE TABLE [테이블명] (
  [열이름] [자료형],
  (...)

  CONSTRAINT [제약조건 이름] PRIMARY KEY ([열이름]),
);

 

* 열 여러 개를 PK로 지정할 시 아웃오브라인 제약 조건 정의 방식을 사용함.

 

 

사용 예시

 

테이블 생성 시 PK 지정

-- COL_ID 열에 PK 제약 조건 정의 (제약 조건 이름 미지정)
CREATE TABLE TB_STUDENT (
  COL_ID VARCHAR2(10) PRIMARY KEY,
  COL_NM VARCHAR2(20) NOT NULL
);

-- COL_ID 열에 PK 제약 조건 정의 (제약 조건 이름 지정)
CREATE TABLE TB_STUDENT2 (
  COL_ID VARCHAR2(10) CONSTRAINT CONSTRAINT_ID PRIMARY KEY,
  COL_NM VARCHAR2(20) NOT NULL
);

-- 아웃오브라인 제약 조건 정의 방식으로 열 2개에 PK 제약 조건 정의 (제약 조건 이름 미지정)
CREATE TABLE TB_CLASS (
  COL_CLASS_CD VARCHAR2(10),
  COL_IDX NUMBER(3),
  COL_NM VARCHAR2(20) NOT NULL,
  PRIMARY KEY(COL_CLASS_CD, COL_IDX)
);

-- 아웃오브라인 제약 조건 정의 방식으로 열 2개에 PK 제약 조건 정의 (제약 조건 이름 지정)
CREATE TABLE TB_CLASS2 (
  COL_CLASS_CD VARCHAR2(10),
  COL_IDX NUMBER(3),
  COL_NM VARCHAR2(20) NOT NULL,
  CONSTRAINT CONSTRAINT_IDX PRIMARY KEY(COL_CLASS_CD, COL_IDX)
);

 

 

PK의 중복 미허용 예시

-- PK 열이 2개인 TB_CLASS 테이블에 데이터 삽입
INSERT INTO TB_CLASS(COL_CLASS_CD, COL_IDX, COL_NM)
VALUES('A500', 100, '김경완');

INSERT INTO TB_CLASS(COL_CLASS_CD, COL_IDX, COL_NM)
VALUES('A500', 101, '임진섭');

INSERT INTO TB_CLASS(COL_CLASS_CD, COL_IDX, COL_NM)
VALUES('B500', 100, '권지수');

INSERT INTO TB_CLASS(COL_CLASS_CD, COL_IDX, COL_NM)
VALUES('B500', 101, '이희진');

SELECT * FROM TB_CLASS;

pk_q1

 

COL_CLASS_CD, COL_IDX가 중복되는 데이터가 있지만, 동일한 COL_CLASS_CD, COL_IDX 안에서 중복되지 않으므로 허용된다. 즉 PK를 구성하는 두 열 모두 중복이 되어야만 오류가 발생하는 것이다.

그렇다면 아래 두 쿼리를 실행해 보자.

 

INSERT INTO TB_CLASS(COL_CLASS_CD, COL_IDX, COL_NM)
VALUES('B500', 101, '남주현');

UPDATE TB_CLASS
   SET COL_CLASS_CD = 'B500'
 WHERE COL_NM = '임진섭';

pk_q2

 

이미 COL_CLASS_CD가 500이고, COL_IDX가 101인 '이희진' 레코드와 중복되기 때문에 두 쿼리는 오류를 발생시킨다.

 

 

PK의 NULL 미허용 예시

INSERT INTO TB_CLASS(COL_CLASS_CD, COL_IDX, COL_NM)
VALUES(NULL, 102, '김해준');

UPDATE TB_CLASS
   SET COL_CLASS_CD = 'B500',
       COL_IDX = NULL
 WHERE COL_NM = '임진섭';

 

위 두 쿼리를 순차적으로 실행하면 아래와 같은 오류를 볼 수 있다. PK는 중복과 NULL을 둘 다 허용하지 않는다.

 

pk_q3
pk_q4

 

반응형