DB

[DB] Data Integrity(데이터 무결성)

Hello? 2017. 11. 17. 13:23

● Data Integrity(데이터 무결성)

1) 데이터 무결성을 지키기 위한 종류와 방법

- 실체(Entity) 무결성

a. 중복된 데이터 방지

b. Primary key, Unique


- 영역(Domain) 무결성 

a. 범위 -> 내가 정해놓은 범위의 데이터만 사용될 수 있게 방지 

b. Check


- 참조(Refereance) 무결성

a. 참조 -> 참조 당하는 테이블을(부모테이블) , 참조 하려는 테이블을(자식테이블)

   데이터 값이 맞는지 다른테이블에 확인할 때 참조한다.

b. Foreign Key


Constraint(제약) : Primary key, Unique, Check, Foreign key 

-> 잘못된 데이터가 들어올때 제약을 걸어주는 역할을 한다.


2) 컬럼의 속성

- NN(Not Null) 속성 : Null값을 거부할수있는 속성을 가짐

a. Primary key = not null + unique가 합쳐진 기능

b. not null

- ND(Not Duplicate) 속성 : 중복된 값을 거부할수 있는 속성을 가짐

a. Primary key

b. Unique 

- NC(No change) 속성 : 수정하는 것을 거부할수 있는 속성을 가짐

a. foreign key




▶ 실체(Entity) 무결성 TEST



테이블 작성

CREATE TABLE tblExam(

id number,

name varchar2(10)

);


데이터 넣기 

INSERT INTO tblExam(name) VALUES('홍길동');

INSERT INTO tblExam(id, name) VALUES(1, '홍길동');


□ PRIMARY KEY

PRIMARY KEY의 조건

1) 절대로 중복이 될수 없는 필드에 줄수 있다. ( 이번 테이블에서는 ID에게 주어야한다.)

2) 처음에 테이블을 만들때 적용, 수정할때 적용 할수 있다.

3) 여러 개의 필드를 묶어서 설정 가능


(1) 테이블 만든 후 PRIMARY KEY 수정해서 적용하는 방법


ALTER TABLE tblExam 

ADD CONSTRAINT pk_id PRIMARY KEY(id);

-> 이대로 적용하면 null 값을 포함하고 있다며 error가 난다.

그러므로 아래의 명령어로 데이터를 지워준 후 다시 PRIMARY KEY적용해준다.


DELETE FROM tblExam;



-> PRIMARY KEY가 적용되어 Null값을 넣을수 없게 되었다.



(2) 테이블 만들기 전에 PRIMARY KEY값 넣는 방법


CREATE TABLE tblExam(

id number primary key,

name varchar2(10)

);




(3) PRIMARY KEY에 대해 구분할수 있게 이름을 붙여서 테이블 생성하는 방법


1) 첫번째 유형


CREATE TABLE tblexam(

id number CONSTRAINT pk_id primary key,

name varchar2(10)

);


유저의 제약 정보를 확인하는 명령어


SELECT constraint_name, table_name

FROM USER_CONSTRAINTS;




2) 두번째 유형 - 여러개 필드를 하나로 묶을 수 있는 방법


CREATE TABLE tblexam(

id number ,

name varchar2(10),

CONSTRAINT pk_id primary key(id, name)

);


SELECT constraint_name, table_name

FROM USER_CONSTRAINTS;




(4) PRIMARY KEY를 삭제해야 하는 상황에서 삭제하는 방법
- Data를 테스트 할때 제약이 걸려있을 경우 확이 이 힘들기에 PK를 삭제해줄때 사용

ALTER TABLE tblExam

DROP CONSTRAINT pk_id;


SELECT constraint_name, table_name

FROM USER_CONSTRAINTS;




□ UNIQUE

1) 중복된 데이터만 막아준다 (ND 속성)

2) 하나의 테이블에 여러 개 사용 가능


CREATE TABLE tblexam(

id number,

name varchar(10),

CONSTRAINT uk_id UNIQUE(id)

);


INSERT INTO tblExam VALUES(1, '홍길동');

INSERT INTO tblExam VALUES(1, '홍길동');

-> 중복된 데이터를 넣었을 때는 오류를 반환한다.


INSERT INTO tblExam(name) VALUES('홍길동');

-> Null은 막아주지 않는다




▶ 영역(Domain) 무결성 TEST


 □ Check

CREATE TABLE tblexam(

id number,

name varchar2(10),

city varchar2(10),

CONSTRAINT ck_city CHECK (city in ('서울','인천','경기','수원'))

);



INSERT INTO tblexam VALUES(1, '홍', '서울');

INSERT INTO tblexam VALUES(2, '임', '제주');



- 필드 추가 (age number)
ALTER TABLE tblexam
ADD age number;


- 제약 추가(나이를 20~50세까지만 입력 받을 수 있게)

ALTER TABLE tblexam

ADD CONSTRAINT ch_age CHECK(age>=20 and age<=50);


INSERT INTO tblexam(id, name, city, age) VALUES(3, '이', '경기', 25);

INSERT INTO tblexam(id, name, city, age) VALUES(4, '김', '경기', 55);





▶ 참조(Refereance) 무결성 TEST


 Foreign Key

1) 참조 당하는(부모) 테이블이 PK 또는 UNIQUE를 설정해 줘야 참조할수 있다.


CREATE TABLE tbldept(

deptno char(3),

dname varchar2(10)

);


INSERT INTO tbldept VALUES('100', '영업부');

INSERT INTO tbldept VALUES('101', '마케팅부');


CREATE TABLE tblemp(

empno number,

ename varchar2(10),

hiredate date,

deptno char(3)

);


ALTER TABLE tbldept

ADD CONSTRAINT pk_deptno PRIMARY KEY(deptno);


ALTER TABLE tblemp

ADD CONSTRAINT fk_deptno FOREIGN KEY(deptno)

REFERENCES tbldept(deptno);


INSERT INTO tblemp VALUES(1, '홍', sysdate, '103');

-> 참조하고 있는 tbldept 테이블에 부서번호 103번이 없기에 에러나고 있다


INSERT INTO tblemp VALUES(1, '홍', sysdate, '100');

-> 참조하고 있는 tbldept 테이블에 부서번호 100번이 있기에 행이 만들어진다.


UPDATE tbldept

SET deptno=105

WHERE deptno=100;

-> 자식 테이블을 참조하고 있기 때문에 변경할 수 없다.


DROP TABLE tbldept;


테이블이나 데이터를 삭제하려면

1) 참조키를 지운다.

2) CASECADE를 이용해서 지운다.

3) 자식 테이블을 지운다.




▶ SEQUENCE TEST


 □ Sequence

CREATE SEQUENCE seq_num;


INSERT INTO tblExam VALUES(seq_num.nextVal, '홍길동');

INSERT INTO tblExam VALUES(seq_num.nextVal, '홍길동');

INSERT INTO tblExam VALUES(seq_num.nextVal, '홍길동');

INSERT INTO tblExam VALUES(seq_num.nextVal, '홍길동');

INSERT INTO tblExam VALUES(seq_num.nextVal, '홍길동');

-> 데이터를 넣고 select로 조회하면 시퀀스 생성 완료


DROP Sequence seq_num;


2씩 증가하는데 100부터 시작

CREATE SEQUENCE seq_num INCREMENT BY 2 START WITH 100;




▶ Default, 필드관리 TEST


 □ Default


CREATE TABLE tblexam(

id number default 0,

name varchar(10) default '무명씨'

);


INSERT INTO tblExam(name) VALUES('홍길동');

INSERT INTO tblExam(id) VALUES(1);







□ 필드 관리 명령어


Null값을 수정하는 방법


ALTER TABLE tblExam

ADD age number not null;



필드를 수정하는 방법


ALTER TABLE tblExam

MODIFY name varchar2(20) not null;



필드를 삭제하는 방법


ALTER TABLE tblExam

DROP COLUMN age;