--무결성 제약 조건(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;
'# 데이터베이스 > 오라클' 카테고리의 다른 글
group by, inner join, left outer join, union,merge (0) | 2013.03.31 |
---|---|
Query(질의), select,order by,숫자 함수, 문자 함수, 내장 함수,Conditional Expression(조건 표현식) (0) | 2013.03.18 |
[DB연습 자료] 부서, 사원, 고객 table (2) | 2013.03.18 |
default 초기치 부여, sequence, index, 칼럼 추가,수정,삭제, 이름변경 (0) | 2013.03.18 |
SQL문의 기초, create table, insert into, update set, delete from (0) | 2013.03.18 |