[ ORACLE 무결성 제약조건 ]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 | --무결성 제약 조건1 -- 데이터가 올바르게 저장될 수 있도록 제약 조건을 거는 것 -- 객체 무결성 -- : 기본키 필드의 데이터는 null값을 가질 수 없으며, 중복된 값이 올 수 없다. -- 참조 무결성 -- : 기본키를 참조하는 외래키(Foreign key)는 null은 허용하되, 참조하는 기본키 -- 값들로 사용되는 값들만 올 수 있다. -- ex) 기본키값이 (A,B,C,D)고 외래키가 이 기본키를 참조한다면 -- 외래키값은 A,B,C,D,null 값들 중에 하나의 값만 입력될 수 있다. -------- [ 제약 조건 ] -------- -- not null -- : NULL값이 입력되지 못하게하는 조건 -- unique : 중복된 값이 입력되지 못하게 하는 조건 -- primary key(PK,기본키) : not null + unique 조건 -- = '객체 무결성' -- foreign key(FK,외래키) : 다른 테이블의 필드(컬럼)를 참조해서 무결성을 검사하는 조건 -- = '참조 무결성' -- check : 주어진 값만 허용하는 조건 -- EX) -- not null ) create table null_test( col1 varchar2(20) not null , -- null 입력 불가 col2 varchar2(20) null , -- null 입력 가능 col3 varchar2(20) -- null 입력 가능 ); insert into null_test(col1,col2) values ( 'aa' , 'bb' ); -- col3에 null들어감 select * from null_test; -- col1은 null이 불가하기 때문에 에러가 발생하게 됨 insert into null_test(col2,col30) values ( 'cc' , 'dd' ); -- unique ) create table unique_test( col1 varchar2(20) unique not null , -- unique + not null = primary key(PK) col2 varchar2(20) unique , col3 varchar2(20) not null , col4 varchar2(20) not null , constraint temp_unique unique (col3,col4) -- col3과 col4를 "조합"했을 때 중복되지 않도록 ); insert into unique_test(col1,col2,col3,col4) values ( 'aa' , 'bb' , 'cc' , 'dd' ); insert into unique_test(col1,col2,col3,col4) values ( 'a2' , 'b2' , 'c2' , 'd2' ); select * from UNIQUE_TEST; -- ERROR 발생 : unique로 중복을 허용하지 않게 해났기 때문에... update unique_test set col1 = 'aa' where col2 = 'b2' ; insert into unique_test(col1,col2,col3,col4) values ( 'a3' , '' , 'c3' , 'd3' ); -- col2에 null값이 가능함으로 들어간다.(스페이스없으면 null) select * from unique_test; -- unique는 null값은 가능함(중복 여부 비교 대상에서 제외함) insert into unique_test(col1,col2,col3,col4) values ( 'a4' , '' , 'c4' , 'd4' ); -- Primary Key(PK,기본키) = UNIQUE + NOT NULL -- 1. 테이블 생성시 기본키 생성 방법 create table primary_test( student_id number(20) primary key , -- 인라인 방식 name varchar2(20) ); create table primary_test2( student_id number(20), name varchar2(20), constraint student_id_pk primary key (student_id) -- 아웃라인 방식 -- 인라인 방식에서는 아웃라인에서처럼 기본키의 이름을 지을 수 없다. ); -- 2. 테이블 생성하고 나서 이후에 기본키를 생성하는 방법 alter table primary_test drop primary key ; -- 기존 기본키 지우기 alter table primary_test add constraint student_id_pk2 primary key (student_id); -- 기본키 추가 -- Foreign Key(FK,외래키) create table foreign_key( department_id constraint dept_fk references departments(department_id) -- 인라인 방식 ); create table foreign_key( department_id number(20), -- 아웃라인 방식 constraint dept_fk2 foreign key (department_id) references departments(department_id) ); -- 테이블 생성 뒤 fk 만들기 -- ALTER TABLE 테이블명 DROP CONSTRAINT fk_table_id; alter table foreign_key drop constraint dept_fk2; -- fk 삭제 -- ALTER TABLE 테이블명 ADD CONSTRAINT fk_table_id FOREIGN KEY(id) REFERENCES 참조테이블명(id); alter table foreign_key add constraints dept_fk3 foreign key (department_id) -- fk 추가 references departments(department_id); -- 참조되고 있는 부모테이블의 데이터를 지우개되면?? -- 그 없어질 데이터를 참조하고 있는 자식 테이블 때문에 에러가 발생함 -- 따라서 지울 수가 없는대, 지울려면 2가지 방법이 있다. -- 1. 자식 테이블에서 해당 부모 테이블을 참조하는 데이터를 먼저 삭제한 뒤 부모테이블 데이터를 삭제한다. -- 2. casecade 키워드를 붙여 삭제한다. -- check ) create table check_test( gender varchar2(10) not null constraint check_sex check (gender IN ( 'M' , 'F' )) -- M,F만 입력 가능해짐 ); create table check_test2( gender varchar2(10) not null constraint check_sex check (gender IN ( '남성' , '여성' )) -- 남성,여성만 입력 가능해짐 ); create table check_test3( score number(20) constraint score_check check (score between 0 and 100), -- 0~ 100 값만 입력 가능 kor varchar2(10) ); |
'스터디 > DB(ORACLE)' 카테고리의 다른 글
ORACLE 시퀀스(sequence) (0) | 2017.09.08 |
---|---|
ORACLE 뷰(View)와 Inline 뷰 (0) | 2017.09.08 |
ORACLE DML( insert, update, delete, select ) (0) | 2017.09.06 |
ORACLE DDL( create, drop, alter, truncate ) (0) | 2017.09.06 |
ORACLE 서브쿼리와 ANY,ALL,IN에 대하여... (3) | 2017.09.06 |