본문 바로가기
oracle

1024_제약조건(foreign key, check, default)

by 신방동불주먹 2022. 10. 26.

<Foreign Key>


1.부모와 자식의 관계를 가지는 자식 쪽 테이블에 설정한다.
2.부모 쪽 테이블의 컬럼은 반드시 primary key 또는 unique 해야한다.
3. null 데이터를 허용한다.


--emp,dept 활용예시
insert into emp
values(1111,'aaa','MANAGER',9999,sysdate,1000,NULL,50);
--오류 보고 -
--ORA-02291: 무결성 제약조건(SCOTT.FK_DEPTNO)이 위배되었습니다- 부모 키가 없습니다


create table emp07(
                                    empno number(4) constraint emp07_empno_pk primary key,
                                    ename varchar2(9)  constraint emp07_empno_nn not null,
                                    job varchar2(9),
                                    deptno number(2)  constraint emp07_deptno_fk references dept07(deptno)
                                    );
                                    
create table dept07(
                                    deptno number(2) constraint dept07_deptno_pk primary key,
                                    dname varchar2(20) constraint dept07_dname_nn not null,
                                    loc varchar2(20) constraint dept07_loc_nn not null
                                    );
                                    
--서브쿼리문을 사용한 데이터 삽입

insert into dept07
select * from dept;

insert into emp07
select empno,ename,job,deptno from emp;

select * from emp07;
select * from dept07;

insert into emp07
values (1111,'aaa','MANAGER',50);

 

<check>

형식 : constraint 제약명 check(조건)

- check () 괄호 안의 조건에 맞는데이터만 삽입 가능

- 조건에는 기본연산자, 비교연산자, in, not in 등 사용

 

Ex) PRODUCT TABLE 중, 가격이 50보다 큰 price 값만 가능

create table product(
	product_bo int not null,
    product_name varchr(10),
    make_day datetime,
    price float,
    product_info varchar(max),
    primary key(product_no),
    constraint chk_price check (price >50)
    
   --product table 중 가격이 5,6,7,8 에 속한 price만 가능
   contraint chk_price check (price in (5,6,7,8))

해당 테이블에 price 값이 50 이하의 데이터를 insert 시 오류 발생한다.

 



create table emp08(
empno number(4) primary key,
ename varchar2(10) not null,
sal number(7) constraint emp08_sal_ck check(sal between 500 and 5000),
gender varchar2(2) constraint emp08_gender_ck check(gender in('M','F'))
);

select * from emp08;                                  

insert into emp08
values(1111,'hong',1000,'M');

insert into emp08
values(2222,'hong',200,'M');

insert into emp08
values(3333,'hong',1000,'A');

 

 

<Default>

컬럼에 특정 값을 디폴트로 설정하면 데이터 입력 시 해당 컬럼에 값을 입력하지 않을 경우 디폴드로 설정한 값이 자동으로 입력된다

null 또는 not null 앞에 위치 시켜야 한다.



create table dept08(
                                    deptno number(2) primary key,
                                    dname varchar2(10) not null,
                                    loc varchar2(15) default 'SEOUL'
                                    );

insert into dept08(deptno,dname)
values(10,'SALES');

insert into dept08(deptno,dname,loc)
values(20,'SALES','BUSAN');

select * from dept08; 

--제약조건 설정방식
--컬럼 레벨의 설정(not null은 컬럼 레벨에서만 가능)
--테이블 레벨의 설정(not null을 적용할 수 없다)
--1. 테이블 안에서 정의 하는 방식
--2. Alter 명령어를 사용 하는 방식


create table emp09(
                                    empno number(4),
                                    ename varchar2(20) constraint emp09_ename_nn not null,  --컬럼레벨
                                    job varchar2(20),
                                    deptno number(20),
                                    
                                    constraint emp09_empno_pk primary key(empno),  --테이블레벨
                                    constraint emp09_empno_uk unique (job),
                                    constraint emp09_deptno_fk foreign key(deptno) references dept(deptno)
                                    );

insert into emp09
values(3333,'HONG','PRESIDENT',80);

 


<복합키>

 

-기본키를 두개의 컬럼을 사용하는 경우

create table member(
                                        name varchar2(10),
                                        address varchar2(30),
                                        hphone varchar2(10),
                                        
                                        constraint member_name_address_pk primary key(name,address)
                                        );


create table emp10(
                                    empno number(4),
                                    ename varchar2(20),
                                    job varchar2(20),
                                    deptno number(20)
                                    );

alter table emp10
add constraint emp10_empno_pk primary key(empno);

alter table emp10
add constraint emp10_empno_fk foreign key(deptno) references dept(deptno);

--not null은 변경의 개념(null -> not null)
alter table emp10
modify job constraint emp10_job_nn not null;

alter table emp10
modify ename constraint emp10_ename_nn not null;

alter table emp10
drop constraint emp10_empno_pk;--제약조건명(constraint) 또는 제약조건(primary key)

drop table emp10;

--========================================
 drop table dept11;
 
 create table dept11(
                                    deptno number(2),
                                    dname varchar2(10),
                                    loc varchar2(15)
                                    );        
                                    
alter table dept11
add constraint dept11_deptno_pk primary key(deptno);        


drop table emp11;

create table emp11(
                                    empno number(4),
                                    ename varchar2(20),
                                    job varchar2(20),
                                    deptno number(20)
                                    );
                                    
alter table emp11
add constraint emp11_empno_pk primary key(empno);        

alter table emp11
add constraint emp11_deptno_fk foreign key(deptno) references dept11(deptno);        

insert into dept11
select * from dept;

insert into emp11
select empno,ename,job,deptno
from emp;

delete from dept11
where deptno = 10;
                                    
alter table dept11
disable primary key cascade; --비활성화 시키는 것

alter table dept11
drop primary key cascade;



'oracle' 카테고리의 다른 글

1026_PL/SQL(변수, 조건문, 반복문)  (0) 2022.10.27
1026_시퀀스  (0) 2022.10.26
뷰 (View)  (0) 2022.10.26
1019_날짜함수  (1) 2022.10.26
1020_서브쿼리  (0) 2022.10.26