Data Base_Oracle/SQL

SQL 제약조건 Check & Default

pathas 2020. 1. 4. 16:14

Check

개발자가 정의하는 제약조건,
상황에 따라 다양한 제약조건 설정 가능

§ 형식

[ SQL> ~~~ 제약조건이름 check(범위지정 or 문자열 지정)]

  • check(age >= 20 and age <= 65)
  • check in('사원', '대리', '계장', '과장', ~)

#예제

▷ [ SQL> alter table b_prtest
add constraint b_prtest_ck_age check(age >= 20 and age <= 65);
SQL> insert into b_prtest values(3, '테스트', 123, '서울시 강남구');
1행에 오류:
ORA-02290: 체크 제약조건(TEST1.B_PRTEST_CK_AGE)이 위배되었습니다 ]

 

▶ [ SQL> insert into b_prtest values(3, '테스트', 23, '서울시 강남구');
1 개의 행이 만들어졌습니다. ]

Default

기본값을 설정해서 데이터 입력/미입력에 따라 편리하게 값을 저장할 수 있음

# 예제

▶ 고용일을 오늘날짜로 자동 저장
[ SQL> alter table b_prtest add (hiredate date default sysdate);
SQL> select * from b_prtest; ]

ID IRUM AGE ADDR HIREDATE
1 홍길동     20/01/03
2 홍길동     20/01/03
3 테스트 23 서울시 강남구 20/01/03

※ 고용일을 입력하지 않았던 로우에도 자동으로 값이 추가됨

 

# insert 활용 예제

▶ [ SQL> insert into b_prtest values(4, '테스트2', 34, '서울시', '2020-01-03');
SQL> insert into b_prtest values(5, '테스트3', 26, '대전 중구', sysdate);
SQL> insert into b_prtest values(6, '테스트4', 22, '부산시', default);
SQL> insert into b_prtest values(7, '테스트5', 27, '부산시', null); ]
default조건이 설정된 칸에 default를 입력하면 기본값(sysdate)이 저장됨
날짜값에 날짜함수 사용가능, null을 입력하면 데이터가 들어가지 않음

ID HIREDATE
4 20/01/03
5 20/01/03
6 20/01/03
7  

※ 데이터 입력 오류 예제
[ SQL> insert into b_prtest values(4, '테스트2', 34, '서울시');
1행에 오류:ORA-00947: 값의 수가 충분하지 않습니다]
※ 데이터 입력 유무와 상관없이( 값이 저장되지 않는 필드가 있더라도 )
insert로 값을 저장할 때는 필드의 개수와 순서를 정확히 맞춰야 함

 

§ insert의 또 다른 형식
[ SQL> insert into 테이블명(필드명1, 필드명2,,,,, 필드명n) values(값1, 값2,,,,값n) ]
1 : 1 대응 관계로 값이 저장됨
null을 허용하는 필드와 default제약조건 필드는 필드명 생략가능,
not null은 생략 불가
▶ [ SQL> insert into b_prtest(id,irum,age) values(8,'테스트8',43);
SQL> select id, hiredate from b_prtest where id=8; ]

ID HIREDATE
8 20/01/03

※ default 필드(HIREDATE)에 값을 따로 설정하지 않았지만 기본값이 저장됨


default와 check 제약조건을 적절히 사용할 수 있다면 조금 더 편리하게 데이터를 저장할 수 있을 것입니다.