제약조건 Constraint
DB에 일관성을 유지하기 위해 테이블에 컬럼에 제약조건을 정의할 수 있다.
제약조건은 한 테이블에서 하나의 컬럼에만 적용되거나,
한 테이블에서 여러 컬럼을 묶여서 적용되거나(복합키),
다른 테이블과 연관시켜 컬럼에 제약조건을 걸 수 있다.(외래키)
제약조건 타입
Primary key 기본키 설정(중복불가, 널 입력 불가)
primary key (지정할 컬럼명)
Not null 널 입력 불가
not null (지정할 컬럼명)
Unique 중복값 입력 불가
unique (지정할 컬럼명)
Check ( )안에 넣은 값으로 컬럼에 입력 가능한 값을 제한한다
check( 조건 )
Foreign key 다른 테이블 특정 컬럼 값 내에서만 값을 설정할수 있도록 관계지은 키.
foreign key (지정할 칼럼명) references 참고할 테이블명( 참고할 컬럼명 )
(지정할 칼럼명) 은 테이블단위 제약조건 정의의 경우만 사용한다.
제약조건 정의 단위
컬럼단위 제약조건 정의
create절이에서 컬럼 정의 바로 뒤에 이어서 정의하는 경우. 컬럼당 제약조건을 주기 때문에 복합키설정은 불가능.
ex) create table emp( sal number(7,2) constraint emp_sal_ck check(sal>1000 and sal<5000) );
테이블단위 제약조건 정의
create 절에서 컬럼 정의를 다 하고나서, 아래 부분에 따로 제약 조건을 정의하는 경우.
ex) create table emp( empno number(5), sal number, ename varchar2(20)
, constraint emp_deptno_fk foreign key(deptno) references dept(deptno) )
복합키는 테이블단위로만 정의가 가능하다. 아래와 같이 복합키로 사용할 컬럼을 나열해준다.
ex) constraint emp_empno_ename_pk primary key(empno, ename);
기존 컬럼에 제약조건 추가, 삭제
alter table 테이블명 add constraint 제약자명 키종류( 대상이 될 컬럼명 )
제약조건 추가는 추가하려는 제약조건과 이미 입력되어 있는 값간에 충돌이 없어야 한다.
ex) 중복이 있는 컬럼에 unique 제약조건 불가.
* not null의 경우는 add가 아닌 modify로 컬럼을 재정의 하면서 constraint를 추가해줘야 한다.
alter table 테이블명 drop constraint 제약자명
* 제약조건 제거는 외래키로 묶여있는 경우 부모 테이블과의 관계를 유의해야 한다.
외래키 관계
외래키로 설정하기 위해선 부모테이블(참조값을 주는 테이블)의 참조 컬럼은 PK나 UK 설정이 되어있어야 한다.
부모테이블의 값이나 제약조건을 제거, 변경하기 위해선 참조중인 자식테이블과의 충돌이 없어야 한다.
Cascade 외래키로 묶여있는 제약조건을 해제할때 사용한다.
ex) alter table 테이블명 drop constraint 제약자명
위와 같이 제약조건을 삭제하려 할때, 해당 제약자가 pk나 uk로 다른 컬럼이 외래키의 참조값으로 사용중인 경우, 삭제가 되지 않는데, 이때 뒤에 cascade를 붙여주면 강제로 외래키 관계를 끊으면서 부모테이블의 제약조건을 삭제한다.
외래키 설정시 미리 references( 컬럼명 ) on delete cascade; 이와같이 on delete cascade 설정을 해놓은 경우,
delete 로 관계된 값을 삭제하더라도 삭제가 가능하고, 이경우 부모테이블에서 삭제된 외래키 값은 자녀테이블에서도
삭제된다. ( *외래키 관계가 삭제되는게 아니라 참조로 연결되어 있는 값들이 삭제되는것 )
이 조건을 잘못 사용할 경우 원치 않게 다른 테이블의 데이터까지 삭제하기 쉽기 때문에 유의해야 한다.
'ORACLE > ORACLE 기초' 카테고리의 다른 글
11. View (0) | 2020.09.12 |
---|---|
10. Transaction, Lock (0) | 2020.09.12 |
8. DDL 데이터베이스 정의 언어 (0) | 2020.09.12 |
7. DML-Insert, Delete, Update (0) | 2020.09.12 |
6. DML - Select구문 (0) | 2020.09.12 |