본문 바로가기

SQL/Oracle

컬럼 속성(무결성 제약조건)

자. 무결성 제약 조건이란 무었인가를 가지고 한번 이야기 해보자. 영어로는 Integrity Constraints이다. 즉 한마디로 정의 하자면 데이터가 정확하게 들어가야 되는데 이것을 데이터 베이스에서 정확하게 데이터가 인입될수 있도록 제공 하는 기능이다. 

NULL
 - NULL은 컬럼의 속성 중 하나로 해당 컬럼이 NULL 값을 허용하는지 허용하지 않는지를 정해 줄 수 있 다.
    NULL 과 (' ')이 다른점은 NULL 은 NULL 값이고 공백은 SPACE 이다.

UNIQUE 
 - 테이블에 있는 데이터를 유일하게 식별하기 위한 무결성 제약 조건중 하나.
 

CREATE TABLE unique_test (
uni_col1 VARCHAR(10) UNIQUE NOT NULL,
uni_col2 VARCHAR(10) UNIQUE
)


이렇게 UNIQUE로 컬럼을 생성하고 값들을 입력 할수가 있는데 중복된 값이 들어가면 오류가 발생 한다. 
한가지 재미있는점은 NULL이 입력되면 에러가 발생할 것 같지만 의외로 정상적으로 입력 된다.
왜냐하면 NULL 은 값이 없음을 의미하므로 UNIQUE 키 비교대상에서 제외 되기 때문이다.
한마디로 UNIQUE 키는 NULL 을 무시한다. 하지만 NULL 대신 (' ' )공백을 넣은다면 오류가 발생한다. 

기본키
 
- 기본키는 UNIQUE + NOTNULL 이다. 어떠한 컬럼을 기본키로 지정하면 UNIQUE 인덱스와 NOT NULL 속성을 가지게 된다.
생성된 제약조건들에 대한 정보는 USER_CONSTRANTS 시스템 뷰로 조회하여 확인 할 수 있다.
기본키를 생성하지 않아도 ALTER 문으로 기본키를 수정해 줄 수가 있는데 다음과 같다.

ALTER TABLE employees
    ADD CONSTRAINTS "emp_emp_id_pk" PRIMARY KEY (employee_id);


외래키
 - 
외래키를 한마디로 정의하자면  자식 테이블의 구분이 되는 키이다.
 
department_id 컬럼에 fk_deptno라는 이름의 외래 키 생성구문

department_id CONSTRAINT fk_deptno
REFERENCES departments (department_id) ); /인라인/


 department_id 컬럼에 fk_deptno라는 이림의 외래키 생성 구문

department_id CONSTRAINT fk_deptno
FOREIGN KEY (department_id)
REFERENCES departments( department_id ) 아웃라인


테이블 생성 후 department_id 컬럼에 kf_deptno 라는 이름으로 외래 키를 추가로 생성하는 구문

ALTER TABLE employees
ADD CONSTRAINTS fk_deptno FOREIGN KEY(department_id)
REPERENCES departments( department_id );


외래키 제약사항
 1. 부모 테이블이 먼저 생성되고 참조하는 부모의 컬럼은 반드시 UNIQUE 나 기본키여야 한다.
 2. LOB,LONG,LONG RAW, VARRAY, NESTED TABLE, BFILE, REF, TIMESTAMP WITH TIME ZONE, 사용자 정
   의 데이터 타입은 외래 키로 지정 불가
 3. 32개까지 외래키를 생성(복합 외래키)
 4. 자식 테이블에 존재하는 값을 부모테이블에서 삭제할 수 없다. 자식 먼저 삭제 그다음 부모 삭제 반대로 인서트는
    부모 먼저 인서트 하고 자식 인서트를 해야 한다. 

CHECK
 - 
값을 체크하여 일정한 조건에 해당되는 값만 입력될 수 있게 하는 제약조건이다. 

gender VARCHAR2(10) NOT NULL CONSTRAINT check_gender CHECK( gender IN ('남성', '여성'))


테이블 복사 
 - 
기존에 있던 테이블을 그대로 복사하는 방법이다. 이경우 테이블 이름은 중복되지 않게 많들어 줘야 하지만 스키마가 다르면 상관이 없다.

CREATE TABLE emp_copy1 AS
SELECT * FROM EMPLOYEES;


제약 사항
 - 원본 테이블의 인덱스 복사하지 않음.
 - 여러가지 제약 사항중 NULL, NOT NULL 속성만 복사 
 - LONG 타입 컬럼은 복사할 수 없다.

Exercise 4

'SQL > Oracle' 카테고리의 다른 글

집계와 조건분기  (0) 2019.05.24
실행 계획  (0) 2017.11.15
옵티마이저  (0) 2017.11.15
4.오라클 식구들(데이터베이스 객체)  (0) 2017.11.15