* 종류

1) NN: NOT null

2) UK: 중복 불허

3) PK: = NN + UK, 테이블 당 한 개만

4) FK: null 또는 referenced column에 존재하는 값만 허용

5) CK: 조건


  * 정의: 테이블 생성시

1) column-level definition

2) table-level definition



drop table d1 purge;

drop table d2 purge;


create table d1 (

 deptno number(2)    primary key,

 dname  varchar2(20) not null,

 dloc   varchar2(20));



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


  * 제약조건에 대한 정보는 USER_CONSTRAINTS 뷰를 질의하면 알 수 있습니다.

SQL> desc user_constraints



SQL> select constraint_name, constraint_type, table_name

 2  from user_constraints

 3  where table_name = 'D1';




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


create table d2 (

 deptno number(2),

 dname  varchar2(20),

 dloc varchar2(20),

   primary key (deptno));

 

drop table d2 purge;


create table d2 (

 deptno number(2) constraint d2_deptno_pk primary key,

 dname  varchar2(20),

 dloc varchar2(20));


select constraint_name, constraint_type, table_name

from user_constraints

where table_name = 'D2';


drop table d2 purge;


create table d2 (

 deptno number(2),

 dname  varchar2(20),

 dloc   varchar2(20),

   constraint d2_deptno_pk primary key (deptno),

   constraint d2_dname_nn  not null (dname));

6행에 오류:

==> ORA-00904: : 부적합한 식별자

==> NOT NULL 제약조건은 Table-Level에서 정의할 수 없습니다.

                       컬럼 레벨에서 정의하거나

무슨 일이 있어도 테이블 레벨에서 정의하고 싶다면 check 제약조건을 사용해야 합니다.


create table d2 (

 deptno number(2),

 dname  varchar2(20),

 dloc   varchar2(20),

   constraint d2_deptno_pk primary key (deptno),

   constraint d2_dname_nn  check (dname is not null));


테이블이 생성되었습니다.


desc d1


이름                                                  널?      유형

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

DEPTNO                        NOT NULL NUMBER(2)

DNAME                         NOT NULL VARCHAR2(20)

DLOC                                   VARCHAR2(20)


desc d2


이름                                                  널?      유형

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

DEPTNO                        NOT NULL NUMBER(2)

DNAME                                  VARCHAR2(20)

DLOC                                   VARCHAR2(20)

==> dname 행에 NOT NULL이 없습니다.



insert into d1 values (10, null, 'Busan');

==> ORA-01400: NULL을 ("JAVA30"."D1"."DNAME") 안에 삽입할 수 없습니다


insert into d2 values (10, null, 'Busan');

==> ORA-02290: 체크 제약조건(JAVA30.D2_DNAME_NN)이 위배되었습니다



alter table d2 modify (dname not null);

desc d2;



insert into d1 values (10, 'SALES', 'Busan');

insert into d1 values (20, 'Executives', 'Seoul');

insert into d1 values (30, 'Advertisement', null);



insert into d2 values (10, 'SALES', 'Busan');

insert into d2 values (20, 'Executives', 'Seoul');

insert into d2 (deptno, dname) values (30, 'Advertisement');


commit;


select * from d1;

select * from d2;


drop table e1 purge;

drop table e2 purge;


create table e1 (

 empno  number(4)    constraint e1_empno_pk  primary key,

 ename  varchar2(20) constraint e1_ename_nn  not null,

 deptno number(2)    constraint e1_deptno_fk references d3(deptno));


==> 오류: ORA-00942: 테이블 또는 뷰가 존재하지 않습니다



create table e1 (

 empno  number(4)    constraint e1_empno_pk  primary key,

 ename  varchar2(20) constraint e1_ename_nn  not null,

 deptno number(2)    constraint e1_deptno_fk references d1(deptno),

 sal    number(8, 2));


create table e2 (

 empno  number(4),

 ename  varchar2(20),

 deptno number(2),

 sal    number(8, 2),

    constraint e2_empno_pk  primary key (empno),

    constraint e2_ename_nn  check(ename is not null),

    constraint e2_deptno_fk foreign key (deptno) references d2(deptno),

    constraint e2_sal_ck    check(sal > 1000));


alter table e1 modify (sal constraint e1_sal_ck check (sal > 1000));



insert into e1 values (1000, 'James', null, 2000);

==> null 값은 parent table의 값과 관계없이 insert 가능


insert into e1 values (2000, 'Adams', 40, 2500);

==> ORA-02291: 무결성 제약조건(JAVA30.E1_DEPTNO_FK)이 위배되었습니다- 부모 키가 없습니다


insert into e1 values (2000, 'Adams', 10, 2500);

insert into e1 values (3000, 'King', 20, 1000);

==> ORA-02290: 체크 제약조건(JAVA30.E1_SAL_CK)이 위배되었습니다


insert into e1 values (4000, 'Clark', 30, 4000);


commit;


insert into e2

 (select * from e1);


update e1

set sal = 1100

where empno = 4000;


insert into e2

 (select * from e1);

==> ORA-00001: 무결성 제약 조건(JAVA30.E2_EMPNO_PK)에 위배됩니다


select * from e1;

select * from e2;




  * 제약조건 정보 확인: user_constraints, all_constraints, dba_constraints


col table_name format a10

col constraint_name format a15

col constraint_type format a5

col search_condition format a20


select table_name, constraint_name

    , constraint_type, search_condition

from user_constraints

where table_name in ('D1', 'D2', 'E1', 'E2');



  * referenced 테이블 삭제


drop table e1 purge;

drop table e2 purge;


create table e1 (

 empno  number(4)    constraint e1_empno_pk  primary key,

 ename  varchar2(20) constraint e1_ename_nn  not null,

 deptno number(2)    constraint e1_deptno_fk references d1(deptno) on delete cascade,

 sal    number(8, 2) constraint e1_sal_ck    check (sal > 1000));


create table e2 (

 empno  number(4),

 ename  varchar2(20),

 deptno number(2),

 sal    number(8, 2),

    constraint e2_empno_pk  primary key (empno),

    constraint e2_ename_nn  check(ename is not null),

    constraint e2_deptno_fk foreign key (deptno) references d2(deptno) on delete set null,

    constraint e2_sal_ck    check(sal > 1000));


insert into e1 values (1000, 'James', null, 2000);

insert into e1 values (2000, 'Adams', 10, 2500);

insert into e1 values (3000, 'King', 20, 1100);

insert into e1 values (4000, 'Clark', 30, 4000);


insert into e2

 (select * from e1);


commit;


drop table d1 purge;

==> 에러 : ORA-02449: 외래 키에 의해 참조되는 고유/기본 키가 테이블에 있습니다



  * referenced 테이블에서 행 삭제


create table e3 (

 empno  number(4)    constraint e3_empno_pk  primary key,

 ename  varchar2(20) constraint e3_ename_nn  not null,

 deptno number(2)    constraint e3_deptno_fk references d1(deptno),

 sal    number(8, 2) constraint e3_sal_ck    check (sal > 1000));


insert into e3 select * from e1;


delete from e3

where empno = 2000;


select * from e3;


delete from d1

where deptno = 30;


==> ERROR at line 1:

   ORA-02292: integrity constraint (JAVA30.E3_DEPTNO_FK) violated - child record found


drop table e3 purge;



select * from d1;

select * from e1;


select * from e2;

select * from d2;


delete from d2

where deptno = 20


select * from d2;

select * from e2;

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

11일차 # 9-32: CTAS  (0) 2012.04.18
11일차 # 9-27: FOREIGN KEY constraints  (0) 2012.04.18
11일차 # 9-14: Interval  (0) 2012.04.18
11일차 # 9-11: Datetime Data Type  (0) 2012.04.18
11일차 # 9-7: Default option  (0) 2012.04.18

+ Recent posts