[펌] http://kr.blog.yahoo.com/minandclub/folder/20.html
========================================
제약조건 (Constraint)
제약조건이란 테이블에 부적절한 자료가 입력되는 것을 방지하기 위해서 여러 가지 규칙을 적용해 놓는거라 생각하면 됩니다. 간단하게
테이블안에서 테이터의 성격을 정의하는 것이 바로 제약조건 입니다.
★
데이터의 무결성 유지를 위하여 사용자가 지정할 수 있는 성질 입니다.
★
모든 CONSTRAINT는 데이터 사전(DICTIONARY)에 저장 됩니다.
★ 의미있는 이름을 부여했다면 CONSTRAINT를 쉽게 참조할 수 있습니다.
★ 표준 객체 명명법을 따르는 것이 좋습니다.
★ 제약조건은 테이블을 생성할 당시에 지정할 수도 있고, 테이블 생성 후 구조변경(ALTER)명령어를
통해서도 추가가 가능합니다.
★ NOT NULL제약조건은 반드시 컬럼 레벨에서만 정의가 가능합니다.
NOT NULL 조건 : 컬럼을 필수 필드화 시킬 때 사용합니다.
|
SQL> CREATE TABLE emp(
ename VARCHAR2(20) CONSTRAINT emp_nn_ename NOT NULL );
이런식으로 하면 ename 컬럼에는 꼭 데이터를 입력해야만 합니다.
여기서 emp_nn_ename은 (테이블이름_제약조건이름_컬럼이름) 형식으로
CONSTRAINT NAME을 정의 합니다.
CONSTRAINT NAME은 USER_CONSTRAINTS 뷰(VIEW)를 통해서 확인할수 있습니다.
SQL> SELECT CONSTRAINT_NAME
FROM USER_CONSTRAINTS
WHERE TABLE_NAME ='EMP' ;
CONSTRAINT_NAME
-----------------------
emp_nn_ename 이런 식으로 제약사항의 이름을 확인할수 있습니다.
|
UNIQUE 조건 :
데이터의 유일성을 보장(중복되는 데이터가 존재할수 없습니다.)
자동으로 index가 생성됩니다.
|
SQL> ALTER TABLE emp
ADD CONSTRAINT emp_uk_deptno UNIQUE (deptno) ;
테이블이 변경되었습니다.
이런식으로 하면 deptno 컬럼에 중복된 데이터가 들어갈 수 없습니다.
-- 제약 조건의 삭제
SQL>ALTER TABLE emp
DROP CONSTRAINT emp_uk_deptno ;
테이블이 변경되었습니다.
|
CHECK 조건 : 컬럼의 값을 어떤 특정 범위로 제한할 수 있습니다.
|
SQL>ALTER TABLE emp
ADD CONSTRAINT emp_ck_comm
CHECK (comm >= 10 AND comm <= 100000) ;
테이블이 변경되었습니다.
comm컬럼은 체크조건에서 제한을 하고 있으므로 1에서 100까지의 값만을 가질수 있습니다.
또 체크 조건에서는 IN 연산자를 사용할수 있습니다.
-- 제약 조건의 삭제
SQL>ALTER TABLE emp
DROP CONSTRAINT emp_ck_comm ;
테이블이 변경되었습니다.
SQL> ALTER TABLE emp
ADD CONSTRAINT emp_ck_comm
CHECK (comm IN (10000,20000,30000,40000,50000)) ;
테이블이 변경되었습니다.
comm 컬럼은 10000,20000,30000,40000,50000의 값만을 가질수 있습니다.
|
DEFAULT(컬럼 기본값) 지정 : 데이터 입력시에 입력을 하지 않아도 지정된 값이 입력될수 있습니다.
|
SQL>CREATE TABLE emp(
hiredate DATE DEFAULT SYSDATE ) ;
이런식으로 하면 hiredate 컬럼에 INSERT를 하지 않아도 오늘 날짜가 들어갑니다. |
PRIMARY KEY 지정 : 기본키는 UNIQUE 와 NOT NULL의 결합과 같습니다.
|
※ 기본키는 그 데이터 행을 대표하는 컬럼으로서의 역할을 수행하여 다른 테이블에서
외래키들이 참조할 수 있는 키로서의 자격을 가지고 있습니다. 이를 참조 무결성이라 합니다.
UNIQUE 조건과 마찬가지로 기본키를 정의하면 자동으로 인덱스를 생성하며
그 이름은 기본 키 제약 조건의 이름과 같습니다. |
INDEX KEY : 검색 키로서 검색 속도를 향상 시킴니다.
(UNIQUE,PRIMARY KEY 생성시 자동적으로 생김니다.)
|
SQL>CREATE TABLE emp(
empno NUMBER CONSTRAINT emp_pk_empno PRIMARY KEY ) ;
이런식으로 하면 empno 컬럼에 UNIQUE 제약조건과 NOT NULL제약조건을 가지게 됩니다. |
FOREIGN KEY(외래 키)지정 : 기본키를 참조하는 컬럼 또는 컬럼들의 집합입니다.
※ 외래키를 가지는 컬럼의 데이터 형은 외뢰키가 참조하는 기본키의 컬럼과 데이터형이
일치해야 합니다.
이를 어기면 참조무결성 제약에의해 테이블을 생성할수 없습니다.
※ 외래키에 의해 참조되고 있는 기본 키는 삭제할수 없다.
※ ON DELETE CASCADE 연산자와 함께 정의된 외래키의 데이터는 그 기본키가 삭제 될 때 같이
삭제됩니다.
|
SQL>ALTER TABLE emp ADD CONSTRAINT emp_fk_deptno
FOREIGN KEY (deptno) REFERENCES dept(deptno)
테이블이 변경되었습니다.
이런식으로 하면 emp 테이블의 deptno 컬럼은 dept 테이블에 deptno 컬럼을 참조하는
외래키를 가지게 됩니다.
직접 변경해 보세요..
|
제약 조건의 확인
USER_CONS_COLUMNS : 컬럼에 할당된 제약 조건을 볼 수 있습니다.
USER_CONSTRAINTS : 유저가 소유한 모든 제약 조건을 불 수 있습니다.
이 두개의 데이터사전을 참조 하면 됩니다.
SQL> SELECT SUBSTR(A.COLUMN_NAME,1,15) COLUMN_NAME,
DECODE(B.CONSTRAINT_TYPE,
'P','PRIMARY KEY',
'U','UNIQUE KEY',
'C','CHECK OR NOT NULL',
'R','FOREIGN KEY') CONSTRAINT_TYPE,
A.CONSTRAINT_NAME CONSTRAINT_NAME
FROM
USER_CONS_COLUMNS A,
USER_CONSTRAINTS B
WHERE A.TABLE_NAME = UPPER('&table_name')
AND A.TABLE_NAME = B.TABLE_NAME
AND A.CONSTRAINT_NAME = B.CONSTRAINT_NAME
ORDER BY 1;
-- 테이블 명을 입력 하면 됩니다.
table_name의 값을 입력하십시오: emp2
COLUMN_NAME CONSTRAINT_TYPE CONSTRAINT_NAME
------------------------------ ----------------- --------------
DEPTNO CHECK OR NOT NULL SYS_C001362
FOREIGN KEY EMP2_FK_DEPTNO
EMPNO PRIMARY KEY EMP2_PK_EMPNO
ENAME CHECK OR NOT NULL EMP2_NN_ENAME
MGR UNIQUE KEY EMP2_UP_MGR