본문 바로가기
DataBase/Oracle

DDL/CONSTRAINT) NOT NULL 제약 조건

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) : 해당 컬럼의 값의 범위/목록을 제한 (도메인을 설정하는 제약 조건)

 

employee 테이블의 제약 조건 조회

select
    *
from
    user_constraints
where
    table_name = 'EMPLOYEE';

user_constraints 테이블에서 조회 할 수 있지만, 해당 테이블에서는 컬럼 명을 확인할 수 없습니다.

 

컬럼명을 확인하고 싶다면, user_cons_columns 테이블에서 조회해야 합니다.

select
    *
from
    user_cons_columns
where
    table_name = 'EMPLOYEE';

user_constraints의 constraint_name과 user_cons_columns의 constraint_name을 비교하여 해당 컬럼명을 찾아낼 수 있습니다.

다만, 이렇게 되면 굉장히 번거로우므로 애초에 제약 조건 설정 시 constraint_name을 잘 지정해주는 습관을 갖는 게 좋습니다!

 


NOT NULL

- 제약 조건을 컬럼 레벨에만 작성 가능

create table member_2(
    id varchar2(20) primary key,
    password varchar2(20) not null,	-- 컬럼 레벨
    name varchar2(50) not null,	-- 컬럼 레벨
    reg_date date default sysdate,
);

desc member_2;

member_2 테이블의 id, password, name은 not null 제약 조건이 지정되어 있습니다.

 

insert into member_2 values ('honggd', '1234', '홍길동', default);
select * from member_2;

 

insert into member_2 values ('sinsa', null, '신사임당', default);   
-- ORA-01400: cannot insert NULL into ("KH"."MEMBER_2"."PASSWORD")

not null 제약 조건이 걸려있는 password에 null을 insert하려고 하니

"ORA-01400: cannot insert NULL into ("KH"."MEMBER_2"."PASSWORD")" 오류 메세지가 뜨는 것을 확인할 수 있습니다.

 

update
    member_2
set
    password = null -- ORA-01407: cannot update ("KH"."MEMBER_2"."PASSWORD") to NULL
where   
    id = 'honggd';

not null 제약 조건은 insert뿐만 아니라 update 구문에 대해서도 허용을 하지 않습니다.

마찬가지로 "ORA-01407: cannot update ("KH"."MEMBER_2"."PASSWORD") to NULL" 오류 메세지가 뜨네요.

 

이처럼 not null 제약 조건은 해당 컬럼에 어떤 방식으로든 null 값을 허용하지 않는다는 것을 알 수 있습니다.