본문 바로가기
DataBase/Oracle

DDL/CONSTRAINT) PRIMARY KEY 제약 조건 (단일 컬럼PK, 복합 컬럼PK)

by 박채니 2022. 4. 26.

안녕하세요, 코린이의 코딩 학습기 채니 입니다.

 

개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.


CONSTRAINT

- 제약 조건

테이블의 컬럼에 대해서 데이터 무결성을 지키기 위해 설정하는 조건

※ 데이터 무결성이란?

데이터가 일관되고, 정확하게 유지 되는 것

not null을 제외하고 constraint_name을 반드시 지정 및 table_level로 작성

 

① not null (C) : 해당 컬럼에 null 값을 허용하지 않음

② unique (U) : 레코드 별로 해당 컬럼에 중복을 허용하지 않음

③ primary key (P) : 식별자 컬럼을 지정, 레코드를 구별하기 위한 고유 값을 가진 컬럼 → 테이블 당 하나만 허용 / null 허용 X

④ foreign key (R) : 외래키. 부모 테이블의 특정 컬럼 값만 사용 가능하도록 제약

⑤ check (C) : 해당 컬럼의 값의 범위/목록을 제한 (도메인을 설정하는 제약 조건)

 


PRIMARY KEY

- 기본 키

- 레코드를 식별할 수 있는 식별자 컬럼에 지정하는 제약 조건

- 테이블 당 하나의 PK만 지정 가능

- 해당 컬럼을 null을 허용하지 않고, 레코드 별로 고유해야 함

- 단일 컬럼 PK / 복합 컬럼 PK

-- drop table member_2;
create table member_2(
    id varchar2(20),
    password varchar2(20) not null,
    name varchar2(50) not null,
    email varchar2(150) not null,
    reg_date date default sysdate,
    constraint pk_member_2_id primary key(id),  -- 테이블 레벨
    constraint uq_member_2_email unique(email)
);

 

중복 값 입력 시

insert into
    member_2 (id, password, name, email)
values ('honggd', '1234', '홍길동', 'honggd@gmail.com');

insert into
    member_2 (id, password, name, email)
values ('honggd', '2345', '홍길순', 'hgd@gmail.com');
-- ORA-00001: unique constraint (KH.PK_MEMBER_2_ID) violated

PK로 지정한 id에 중복되는 값이 들어가니

"ORA-00001: unique constraint (KH.PK_MEMBER_2_ID) violated" 에러 메세지가 출력 되는 것을 확인할 수 있습니다.

 

null 값 입력 시

insert into
    member_2 (id, password, name, email)
values (null, '1234', '신사임당', 'sinsa@gmail.com');
-- ORA-01400: cannot insert NULL into ("KH"."MEMBER_2"."ID")

null 값 또한 "ORA-01400: cannot insert NULL into ("KH"."MEMBER_2"."ID")" null 값을 삽입할 수 없다는 에러 메세지가 출력 되는 것을 확인할 수 있습니다.

고유 값이기 때문에 하나의 행을 식별하는 용도로 PK컬럼을 자주 사용합니다.

update  member_2 set name = '홍길똥' where id = 'honggd';
select * from member_2 where id = 'honggd';	-- 1행 또는 0행의 결과집합을 리턴
--delete from member where id = 'honggd';

 


복합 PK (Composite PK)

- 여러 컬럼을 묶어서 고유하게 관리, 식별자로 사용

create table tb_order_2 (
    product_no number,  --상품 식별자
    member_id varchar2(20), --회원 식별자
    order_date date default sysdate,    --주문일자
    cnt number default 1,
    constraint pk_tb_order_2 primary key(product_no, member_id, order_date)
);

insert into tb_order_2 values (1, 'honggd', default, 10);
insert into tb_order_2 values (1000, 'honggd', default, 10);
insert into tb_order_2 values (1000, 'honggd', default, 5);
-- ORA-00001: unique constraint (KH.PK_TB_ORDER_2) violated

product_no, member_id, order_date를 묶어서 관리하기 때문에 해당 컬럼들의 값이 모두 동일하면

"ORA-00001: unique constraint (KH.PK_TB_ORDER_2) violated" 마찬가지로 해당 에러 메세지를 출력합니다.

 

insert into tb_order_2 values (1000, null, default, 10);
-- ORA-01400: cannot insert NULL into ("KH"."TB_ORDER_2"."MEMBER_ID")

PK컬럼을 null 값을 허용하지 않으므로, 복합 PK 컬럼 중 하나라도 null일 수 없습니다.

"ORA-01400: cannot insert NULL into ("KH"."TB_ORDER_2"."MEMBER_ID")"

 

select
    product_no,
    member_id,
    to_char(order_date, 'yyyy-mm-dd hh24:mi:ss') as order_date,
    cnt
from
    tb_order_2;