# 데이터베이스/오라클

무결성 제약 조건(constraint), 기본키 제약조건, check, unique, foreign key, 참조키

dev-jjong 2013. 3. 18. 21:24

--무결성 제약 조건(constraint) : 잘못된 자료를 막기위한 입력 제한 조건 부여

--기본키 제약 조건 : 중복 레코드 입력 방지, not null
방법1) 컬럼 레벨 -

제약조건의 이름을 컴퓨터가 맘대로 부여한다. 이름을 사용할 필요가 없을때 방법1을 사용
create table aa(bun number primary key, irum char(10));
select table_name, constraint_type, constraint_name from user_constraints WHERE
table_name='AA';
drop table aa;

방법2) 이름을 부여한 컬럼 레벨 -제약 조건의 이름을 알아야 지울 수 있기 때문에
          create table aa(bun number constraint aa_bun  primary key, irum char(10));
          select table_name, constraint_type, constraint_name from user_constraints WHERE
          table_name='AA';
          drop table aa;

방법3) 테이블 레벨
         create table aa(bun number, irum char(10), constraint aa_bun_pk primary key(bun));
         select table_name, constraint_type, constraint_name from user_constraints WHERE
         table_name='AA';
         drop table aa;
         select * from aa;


참고) 제약조건 추가
create table aa(bun number, irum char(10));
alter table aa add constraint aa_bun_pk primary key(bun);
select table_name, constraint_type, constraint_name from user_constraints WHERE
table_name='AA';
참고> 제약조건 삭제
alter table aa drop constraint aa_bun_pk;
drop table aa;

 

 

--Check 제약 조건: 입력되는 자료의 특정 칼럼 값 검사
create table aa(bun number, irum char(10), nai number(2) check(nai >= 20));
select table_name, constraint_type, constraint_name from user_constraints WHERE
table_name='AA';
insert into aa values(1,'홍길동',23);
insert into aa values(2,'고길동',13);  --check로 제약조건을 20살 이상으로 걸어놔서 안된다.
drop table aa;

 

--Unique 제약 조건 : 특정 칼럼의 동일한 값 입력 불허
create table aa(bun number primary key,name char(10) unique);
select table_name, constraint_type, constraint_name from user_constraints WHERE
table_name='AA';
insert into aa values(1,'홍길동');
insert into aa values(2,'고길동');
insert into aa values(3,'홍길동');   -- name에 unique를 걸었기 때문에 동일한 값의 입력을 불허한다.
drop table aa;

 

--외부키(Foreign key, 참조키, fk) 제약 조건 : 다른 테이블의 칼럼 값을 참조

                                                                           (fk 대상은 pk 이어야 한다.)
on delete cascade : 부모 테이블의 행이 삭제되면 자식의 종속행은 모두 자동 삭제

                             (위험한 명령이라 프로그래머는 잘쓰지않음)
create table jikwon(bun number primary key, irum varchar2(10), buser char(10));
insert into jikwon values(1,'한송이','인사과');
insert into jikwon values(2,'박치기','영업과');
select * from jikwon;
commit;   -- *중요*   commit을 해줘야 데이터가 실제로 기록이된다. 즉 다른데 불러올수있다.!
          -- 원본 DB에 실제로 자료가 기억됨. 공유가 가능.

방법1)         
create table gajok(code number primary key, name varchar2(10), birth date, jikwon_bun number references jikwon(bun));
--jikwon_bun이 참조 칼럼(FK) *완전 중요해!*
--FK는 jikwon테이블에 bun을 참조 중이다. 이 때 참조 당하는 bun은 반드시 PK여야한다. 안그러면 참조할때 헤깔린다.
drop table gajok;
방법2)
create table gajok(code number primary key, name varchar2(10), birth date, jikwon_bun number,
constraint gajok_bun_fk foreign key(jikwon_bun) references jikwon(bun));

select table_name, constraint_type, constraint_name from user_constraints WHERE
table_name='GAJOK';

insert into gajok values(100, '한국인', '2000-03-13', 5);  --에러: 직원 중에 5번이 없기 때문에 에러
insert into gajok values(100, '한국인', '2000-03-13', 1);
insert into gajok values(101, '박가람', '1999-12-01', 2);
insert into gajok values(102, '한사람', '2005-03-13', 1);

select * from gajok;

select * from jikwon;
insert into jikwon values(3,'신기해','임시직');
DELETE FROM jikwon WHERE bun = 2;  --에러 : 참조되고있는 레코드는 삭제 할 수없다. 가족테이블에서 참조하고 있기때문에. 가족테이블부터 지워줘야한다.
DELETE FROM jikwon WHERE bun = 3;  -- 성공 : 잘지워진다.  참조되고 있지 않으므로.
select * from jikwon;

drop table jikwon;  -- 에러 : gajok 자료가 있으므로
delete from gajok where code = 101;  -- 가족자료를 지운다.
delete from jikwon WHERE bun=2;   --성공 : gajok 자료가 없으므로
select * from jikwon;

delete from gajok;
drop table gajok;
drop table jikwon;
SELECT * FROM jikwon;