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');