05. Oracle DB, 제약조건 (Constraint)
○ 테이블 제약조건
① primary key
- 기본키, 유일성
- 중복 및 null값을 허용하지 않음 (빈값을 허용하지 않음)
- where 조건절에 걸릴 수 있는 대표적인 칼럼을 강제할 수 있다
- 예) 주민등록번호, 핸드폰번호, 이메일, 아이디, 계좌번호 등
② not null
- 빈값을 허용하지 않음 (반드시 입력해야 함)
③ check
- 입력할 값을 특정범위로 제한하는 조건
④ default
- 사용자가 값을 입력하지 않으면 해당칼럼이 정의한 기본값을 자동으로 입력
⑤ unique
- 중복 허용 안함
- null값은 한번만 허용
⑥ foreign key
- 외래키, 테이블 조인하는 경우 부모와 자식 관계를 설정
-- sungjuk테이블 생성
create table sungjuk(
sno int primary key -- 기본키
,uname varchar(50) not null -- 빈값을 허용하지 않음
,kor int check(kor between 0 and 100) -- 국어 점수 0~100사이만 입력가능
,eng int check(eng between 0 and 100) -- 영어 점수 0~100사이만 입력가능
,mat int check(mat between 0 and 100) -- 수학 점수 0~100사이만 입력가능
,addr varchar(20) check(addr in('Seoul', 'Jeju', 'Busan', 'Suwon'))
,aver int default 0 -- 값을 입력하지 않으면 기본값0
,wdate date default sysdate -- 값을 입력하지 않으면 기본값 현재 날짜
);
○ 제약조건 위배시 에러 메세지
① primary key
- ORA-00001: 무결성 제약 조건(SYSTEM.SYS_C007358)에 위배됩니다
-- sno칼럼은 기본키(PK)이므로 중복된 값을 허용하지 않음
insert into sungjuk(sno, uname, kor, eng, mat) values(2, '홍길동', 10, 20, 30); --ORA-00001
② not null
- ORA-01400: NULL을 ("SYSTEM"."SUNGJUK"."UNAME") 안에 삽입할 수 없습니다
-- uname칼럼에 반드시 값을 입력해야 함
insert into sungjuk(sno, kor, eng, mat) values(1, 10, 20, 30); --ORA-01400
③ check
- ORA-02290: 체크 제약조건(SYSTEM.SYS_C007354)이 위배되었습니다
-- 국영수 점수는 0~100 사이만 가능
insert into sungjuk(sno, uname, kor, eng, mat) values(1, '홍길동', -10, 20, 30); --ORA-02290
④ 칼럼의 개수와 값 개수가 일치하지 않는 경우
- SQL 오류: ORA-00913: 값의 수가 너무 많습니다
insert into sungjuk(sno, uname, kor, eng, mat) values(10, '홍길동', 10, 20, 30, 'Seoul'); --ORA-00913