안녕하세요, 코린이의 코딩 학습기 채니 입니다.
개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.
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 값을 허용하지 않는다는 것을 알 수 있습니다.
'DataBase > Oracle' 카테고리의 다른 글
DDL/CONSTRAINT) PRIMARY KEY 제약 조건 (단일 컬럼PK, 복합 컬럼PK) (0) | 2022.04.26 |
---|---|
DDL/CONSTRAINT) UNIQUE 제약 조건 (제약 조건 작성법, constraint_name) (0) | 2022.04.26 |
DDL) CREATE 구문 (테이블/열 이름 생성 규칙, 주석) (0) | 2022.04.26 |
DML) DELETE 구문 (delete, truncate의 차이) (0) | 2022.04.26 |
DML) UPDATE 구문 (0) | 2022.04.26 |