[DB] 제약 사항, ERD(Entity Relationship Diaglam)

* 제약 사항

- 컬럼에 원하는 값을 받기위해서 설정하는 것이다.

- primary key(P), foreign key(R), unique(U), [not null, check](C), default가 있다.

- 제약사항은 user_constraints테이블에서 확일할 수 있다.

- 제약사항은 테이블 생성시 컬럼 단위 제약사항 또는 테이블 단위로 설정 할 수 있다.

- alter를 사용하면 제약사항의 추가, 삭제, 활성화, 비활성화를 할 수 있다.

 

+ primary key(기본키)

- 중복값을 허용하지 않고, null을 혀용하지 않는다.

- 유일한 값으로 관리해야 할 때 사용한다.                                                                                                             - - 다른 테이블에서 참조할 수 있다.(관계)

- Oracle은 자동으로 index를(user_indexes) 생성한다.

- 테이블에 하나를 설정한다.(하나 또는 여러개의 컬럼이 조합될 수 있다.)

- 문법

+ column 단위

create table 테이블명(

컬러명 데이터형(크기) [constraint 제약사항명](생략할 경우 oracle이 명명) primary key,,,

);

+ table 단위

create table 테이블명(

컬럼명, 데이터형(크기),,,,

constraint 제약사항명 primary key(적용 컬럼,,,),,,

);

[참고] 제약사항명은 PK_테이블명 형식으로 지정해준다.

더보기

select * from user_constraints;

select * from user_indexes;

 

--------------------------------------------------------------

-- primary key

--------------------------------------------------------------

 

-- *컬럼단위 제약사항 ----------------------------------------

 

-- **primary key만 명시 했을 때,----

create table column_primary(

name varchar2(15 byte),

id varchar2(16 byte) primary key,

address varchar2(100 byte)

);

-- *위 테이블에 데이터 추가 실패 예제

insert into column_primary(id) values('kim');

-- └insert ok

insert into column_primary(id) values('kim');

-- └error msg1 : 무결성 제약 조건(SCOTT.SYS_C0011146)에 위배됩니다.(중복 배제)

insert into dept(deptno) values(10);

-- └error msg2 : 무결성 제약 조건(SCOTT.PK_DEPT)에 위배됩니다

/*

위 예제 결론 : primary key만 사용하면 제약사항명이 자동생성되므로 제약사항에 위배가 되었을때 어떤 제약사항인지 판단이 어렵다.

이름을 명시 하지 않은 error msg1보다 제약사항의 이름을 명시해준 error msg2가 문제에 대해 직관적으로 쉽게 알 수 있다.

*/

 

drop table column_primary;

purge recyclebin;

 

-- **제약사항명을 명시 했을 때,----

create table column_primary(

name varchar2(15 byte),

id varchar2(16 byte) constraint pk_column_primary primary key,

address varchar2(100 byte)

);

-- *위 테이블에 데이터 추가 성공 예제

-- 1. 최초로 데이터를 입력하는 경우

insert into column_primary(name, id, address) values ('김기범', 'bumkey', '대구');

select * from column_primary;

-- 2. 아이디가 다른 경우(다른 값은 다 같아도 무관하다.)

insert into column_primary(name, id, address) values ('김기범', 'little freak', '대구');

select * from column_primary;

 

-- *위 테이블에 데이터 추가 실패 예제

-- 1. 아이디가 같은 경우

insert into column_primary(name, id, address) values ('김똑띨', 'bumkey', '프랑스 대구');

select * from column_primary;

-- └error msg : 무결성 제약 조건(SCOTT.PK_COLUMN_PRIMARY)에 위배됩니다

-- 2. null이 들어가는 경우

-- (컬럼의 데이터형이 정수인 경우에는 컬럼을 생략하여 추가 할 때 null이 들어간다.)

-- (컬럼의 데이터형이 문자열인 경우에는 컬럼을 생략하거나 ''을 사용하면 null이 입력된다.)

insert into column_primary(name, id, address) values ('이진기', '', '광명시');

insert into column_primary(name, address) values ('이진기', '광명시');

-- └error msg : NULL을 ("SCOTT"."COLUMN_PRIMARY"."ID") 안에 삽입할 수 없습니다

 

--------------------------------------------------------------

 

 

 

-- *테이블 단위 제약사항 -----------------------------------------

create table table_primary(

name varchar2(15 byte),

id varchar2(16 byte),

address varchar2(100 byte),

constraint pk_table_primary primary key(id)

);

select * from table_primary;

 

-- *여러개의 컬럼이 primary key인 경우

create table multi_primary(

item varchar2(30 byte),

lot char(5 byte),

p_date char(10 byte),

constraint pk_multi_primary primary key(lot,p_date)

);

-- *위 테이블에 데이터 추가 성공 예제

-- 1. 날짜가 다르다면 lot번호는 중복될 수 있다.

insert into multi_primary(item, lot, p_date) values('미사일', 'L-001', '2014-09-26');

select * from multi_primary;

insert into multi_primary(item, lot, p_date) values('미사일', 'L-001', '2014-09-25');

select * from multi_primary;

-- 2. lot번호가 다르다면 날짜는 중복될 수 있다.

insert into multi_primary(item, lot, p_date) values('핵폭탄', 'L-002', '2014-09-26');

select * from multi_primary;

insert into multi_primary(item, lot, p_date) values('나무방패', 'L-003', '2014-09-25');

select * from multi_primary;

-- *위 테이블에 데이터 추가 실패 예제

-- 날짜와 lot가 같을 때

insert into multi_primary(item, lot, p_date) values('나무칼', 'L-004', '2014-09-26');

select * from multi_primary;

insert into multi_primary(item, lot, p_date) values('나무칼', 'L-004', '2014-09-26');

select * from multi_primary;

-- └error msg : 무결성 제약 조건(SCOTT.PK_MULTI_PRIMARY)에 EMP위배됩니다

 

select * from user_indexes;

 

-----------------------------------------------------------------

 

 

+ foreign key(참조키, 외래키)

- 다른 테이블(부모 테이블)의 컬럼값을 참조하여 현재 테이블(자식 테이블)에 컬럼값을 넣을 때

- 테이블간의 관계가 설정된다.

- 부모 테이블의 PK 또는 Unique로 설정된 컬럼만 참조할 수 있다.

- null을 허용한다. 따라서 1 : 0관계가 될 수도 있다.

- 자식 테이블의 컬럼명은 부모 테이블과 같은 필요는 없다. 데이터형과 크기만 같으면 된다.

- 문법

+ column 단위

create table 테이블명(

컬럼명 데이터형(크기) constraint 키명 references 부모 테이블명 (참조할 컬럼명),,,

...

);

+ table 단위

create table 테이블명(

컬럼명 데이터형(크기),

...

constraint 키명 foreign key(적용할 컬럼) references 부모 테이블명(참조할 컬럼명),,,

...

);

[참고] 제약사항명은 FK_컬럼명 형식으로 지정해준다.

더보기

--------------------------------------------------------------

-- foreign key

--------------------------------------------------------------

 

-- *컬럼단위 제약사항 ----------------------------------------

 

-- 문) column_primary 테이블의 id컬럼을 외래키로 참조하는 테이블을 생성하라.

create table column_foreign(

id varchar2(16 byte) constraint fk_id references column_primary(id),

subject varchar2(30 byte),

score number(3)

);

select * from column_foreign;

select * from user_constraints;

 

-- *위 테이블에 데이터 추가 성공 예제

-- 1. 같은 id로 추가 가능

insert into column_foreign(id, subject, score) values ('bumkey', 'oracle', 55);

select * from COLUMN_PRIMARY;

select * from COLUMN_FOREIGN;

insert into column_foreign(id, subject, score) values ('bumkey', 'oracle', 84);

-- 2. 다른 id로 추가 가능

insert into column_foreign(id, subject, score) values ('little freak', 'oracle', 84);

-- 3. null도 추가 가능

insert into column_foreign(id, subject, score) values ('', 'oracle', 73);

insert into column_foreign(subject, score) values ('oracle', 74);

 

-- *위 테이블에 데이터 추가 실패 예제

-- 1. 부모 테이블에 없는 값이 들어갔을 때

insert into column_foreign(id, subject, score) values ('Key', 'oracle', 90);

-- └error msg : 무결성 제약조건(SCOTT.FK_ID)이 위배되었습니다- 부모 키가 없습니다

 

-- *FK설정해둔 값 삭제 예제

-- 1. 부모 자식 관계가 있는 경우

-- (부모테이블의 값을 참조하는 컬럼이 있다면 부모테이블에서 해당 값은 삭제되지 않는다.)

delete from column_primary where id = 'bumkey';

-- └error msg : 무결성 제약조건(SCOTT.FK_ID)이 위배되었습니다- 자식 레코드가 발견되었습니다

 

-- 2. 부모 자식 관계가 없는 경우

delete from column_primary where id = '밍뭉';

 

-- 3. 부모 자식 관계가 있을 때 자식레코드를 모두 삭제한 후 부모 테이블에서 삭제할 때는 삭제가 가능하다.

delete from column_foreign where id = 'bumkey';

delete from column_primary where id = 'bumkey';

select * from COLUMN_PRIMARY;

select * from COLUMN_FOREIGN;

--------------------------------------------------------------

 

 

 

 

-- *테이블단위 제약사항 ----------------------------------------

 

-- *제약사항명은 테이블이 다르더라도 중복될 수 없다.

create table table_foreign(

id varchar2(16 byte),

subject varchar2(30 byte),

score number(3),

constraint fk_id foreign key(id) references column_primary(id)

);

-- └error msg : 기존의 제약에 사용된 이름입니다

create table table_foreign(

id varchar2(16 byte),

subject varchar2(30 byte),

score number(3),

constraint fk_f_id foreign key(id) references column_primary(id)

);

select * from user_constraints;

 

--------------------------------------------------------------

 

 

* ERD(Entity Relationship Diaglam)

- 테이블 도식화

- 도형과 선으로 테이블의 구조와 관계를 보여준다.

- 논리 모델(글)과 물리 모델(컬럼명, 데이터형, 크기 설정) 두 가지로 그린다.

─ 식별관계 : PK인 컬럼을 다른 테이블에서 PK로 참조하여 사용

- - - - - 비식별관계 : PK인 컬럼을 다른 테이블에서 일반 컬럼이 참조할 때

'예전 포스팅 모음' 카테고리의 다른 글

[DB] join, ALTER  (0) 2014.09.30
[DB] Unique, not null, check 조건, default, union, join  (0) 2014.09.29
[java] java.lang 패키지  (0) 2014.09.25
[DB] 테이블 생성 및 curd sql문 예제  (0) 2014.09.25
[DB] sub query, rownum  (0) 2014.09.25