SQL
[Oracle] 제약조건
ㄷㅐ장님
2022. 1. 4. 00:07
제약조건
-테이블의 데이터에 대한 규칙을 만든다
-데이터에 대한 품질을 향상시키기 위해서 만든다
- 제약조건 정보 확인
select * from user_constraints where table_name = 'EMP';
select * from user_cons_columns where table_name = 'EMP';
- 인덱스 정보 확인(제약조건 이름 = 인덱스 이름)
select * from user_indexes where table_name = 'EMP';
select * from user_ind_columns where table_name = 'EMP';
1. Primary key
: 테이블의 대표키
-unique, null값은 허용X
-테이블 당 하나 생성
-자동으로 unique index 생성
-동일한 유저 내에서 제약조건 이름은 고유한 이름으로 생성해야한다.
- PK제약조건 추가
alter table emp add constraint emp_id_pk primary key(id);
alter table emp add primary key(id); --제약조건 이름을 명시하지 않으면 자동으로 sys_c숫자이름으로 생성된다.
--하지만 유지관리를 위해 이름설정 선호!
- PK제약조건 삭제
alter table emp drop constraint emp_id_pk;
alter table emp drop primary key;
2. Foreign key
: 외래키, 참조무결성 제약조건
-동일한 테이블이나 다른 테이블의 primary key 또는 unique key 제약조건을 참조한다
-데이터 품질 ↑
-중복값,null값 허용
-종속되는 행의 삭제를 불허한다.
-열레벨 : foreign key 키워드 사용 X
-테이블레벨 : foreign key 키워드 사용
emp dept reference dept
id name dept id(fk) ----------> dept_id(pk) dept_name
1 홍길동 10 10 총무부
2 null 20 20 분석팀
- FK제약조건 생성
alter table emp add constraint emp_dept_id_fk
foreign key(dept_id) references dept(dept_id);
- FK제약조건 삭제
alter table emp drop constraint EMP_DEPT_ID_FK; --1 foreign key 제약조건 삭제
alter table dept drop primary key; --2 primary key 제약조건 삭제
alter table dept drop primary key cascade; --cascade 옵션을 사용하면 foreign key 제약조건을 먼저 삭제하고,
--primary key 제약조건을 삭제한다.(1+2)
3. unique 제약조건
: 유일한 값만 체크
-null 허용
-자동으로 unique index 생성된다.
- unique제약조건 생성
- dept 테이블에 있는 dept_name 유일한값만 입력될 수 있도록 unique 제약조건을 추가하자.
alter table dept add constraint dept_name_uk unique(dept_name);
- unique제약조건 제거
alter table dept drop constraint dept_name_uk;
alter table dept drop unique(dept_name); --column 표현
4. check 제약조건
: 조건에 값이 true인 경우 insert, update 할 수 있도록 만드는 제약조건
-null 허용, 중복되는 값 허용
- check 제약조건 생성
alter table emp add constraint emp_sal_ck check(sal >= 1000);
alter table emp add constraint emp_sal_ck check(sal>=1000 and sal<= 5000);
- check 제약조건 제거
alter table emp drop constraint emp_sal_ck;
5. not null 제약조건
: null값을 허용할 수 없는 제약조건
-not null 제약조건은 modify를 이용해서 추가해야한다.
-열레벨정의에서만 제약 가능
- not null 제약조건 생성
alter table dept add constraint dept_name_nn not null(dept_name);
- not null 제약조건 삭제
alter table dept add constraint dept_name_nn not null(dept_name);
기존 테이블에서 제약조건 걸기
alter table dept add constraint dept_dept_id_pk primary key(dept_id);
테이블을 생성하면서 제약조건 걸기
create table emp(
id number constraint emp_id_pk primary key, --열레벨 정의
name varchar2(30) constraint emp_name_nn not null, --not null 제약은 열레벨 정의만 가능
sal number,
dept_id number constraint emp_dept_id_fk references dept(dept_id), --열레벨로 foreign key 제약조건할 때
--foreign key 키워드 사용 X
constraint emp_name_uk unique(name), --테이블레벨 정의
constraint emp_sal_ck check(sal between 1000 and 5000));
select * from user_constraints where table_name in ('EMP','DEPT');
create table emp(
id number constraint emp_id_pk primary key, --열레벨 정의
name varchar2(30) constraint emp_name_nn not null, --not null 제약조건은 열레벨 정의만 가능
sal number,
dept_id number,
constraint emp_name_uk unique(name), --테이블레벨 정의
constraint emp_sal_ck check(sal between 1000 and 5000)
constraint emp_dept_id_fk foreign key(dept_id) references dept(dept_id); --테이블 레벨로
--foreign key 제약조건 할때
--꼭 foreign kry 키워드 꼭 써야함!
select * from user_constraints where table_name in ('EMP','DEPT');