[    ORACLE 무결성 제약조건    ]




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
--무결성 제약 조건1
    --  데이터가 올바르게 저장될 수 있도록 제약 조건을 거는 것
     
  -- 객체 무결성
      -- : 기본키 필드의 데이터는 null값을 가질 수 없으며, 중복된 값이 올 수 없다.
  -- 참조 무결성
      -- : 기본키를 참조하는 외래키(Foreign key)는 null은 허용하되, 참조하는 기본키
        -- 값들로 사용되는 값들만 올 수 있다.
        -- ex) 기본키값이 (A,B,C,D)고 외래키가 이 기본키를 참조한다면
        --     외래키값은 A,B,C,D,null 값들 중에 하나의 값만 입력될 수 있다.
   
  -------- [ 제약 조건 ] --------
  -- not null
      -- : NULL값이 입력되지 못하게하는 조건
   
  -- unique : 중복된 값이 입력되지 못하게 하는 조건
   
  -- primary key(PK,기본키) : not null + unique 조건
      --  = '객체 무결성'
  -- foreign key(FK,외래키) : 다른 테이블의 필드(컬럼)를 참조해서 무결성을 검사하는 조건
      --  = '참조 무결성'
   
  -- check : 주어진 값만 허용하는 조건
   
  -- EX)
   
  -- not null )
  create table null_test(
    col1 varchar2(20) not null, -- null 입력 불가
    col2 varchar2(20) null, -- null 입력 가능
    col3 varchar2(20) -- null 입력 가능
  );
   
  insert into null_test(col1,col2) values('aa','bb'); -- col3에 null들어감
  select * from null_test;   
   
  -- col1은 null이 불가하기 때문에 에러가 발생하게 됨
  insert into null_test(col2,col30) values('cc','dd');
   
  -- unique )
  create table unique_test(
    col1 varchar2(20) unique not null, -- unique + not null = primary key(PK)
    col2 varchar2(20) unique,
    col3 varchar2(20) not null,
    col4 varchar2(20) not null,
    constraint temp_unique unique(col3,col4) -- col3과 col4를 "조합"했을 때 중복되지 않도록
  );
   
  insert into unique_test(col1,col2,col3,col4)
  values('aa','bb','cc','dd');
   
  insert into unique_test(col1,col2,col3,col4)
  values('a2','b2','c2','d2');
   
  select * from UNIQUE_TEST;
   
  -- ERROR 발생 : unique로 중복을 허용하지 않게 해났기 때문에...
  update unique_test set col1 = 'aa' where col2 = 'b2';
   
  insert into unique_test(col1,col2,col3,col4)
  values('a3','','c3','d3'); -- col2에 null값이 가능함으로 들어간다.(스페이스없으면 null)
  select * from unique_test; -- unique는 null값은 가능함(중복 여부 비교 대상에서 제외함)
   
  insert into unique_test(col1,col2,col3,col4)
  values('a4','','c4','d4');
   
  -- Primary Key(PK,기본키) = UNIQUE + NOT NULL
    -- 1. 테이블 생성시 기본키 생성 방법
  create table primary_test(
    student_id number(20) primary key, -- 인라인 방식
    name varchar2(20)
  );
   
  create table primary_test2(
    student_id number(20),
    name varchar2(20),
    constraint student_id_pk primary key(student_id) -- 아웃라인 방식
    -- 인라인 방식에서는 아웃라인에서처럼 기본키의 이름을 지을 수 없다.
  );
   
    -- 2. 테이블 생성하고 나서 이후에 기본키를 생성하는 방법
    alter table primary_test drop primary key; -- 기존 기본키 지우기
    alter table primary_test add constraint student_id_pk2 primary key (student_id); -- 기본키 추가
     
   
  -- Foreign Key(FK,외래키)
  create table foreign_key(
    department_id constraint dept_fk references departments(department_id) -- 인라인 방식
  );
   
  create table foreign_key(
    department_id number(20),
    -- 아웃라인 방식
    constraint dept_fk2 foreign key (department_id) references departments(department_id)
  );
   
  -- 테이블 생성 뒤 fk 만들기
      --  ALTER TABLE 테이블명 DROP CONSTRAINT fk_table_id;
  alter table foreign_key drop constraint dept_fk2; -- fk 삭제
   
      --  ALTER TABLE 테이블명 ADD CONSTRAINT fk_table_id FOREIGN KEY(id) REFERENCES 참조테이블명(id);
  alter table foreign_key add constraints dept_fk3 foreign key(department_id) -- fk 추가
  references departments(department_id);
   
    -- 참조되고 있는 부모테이블의 데이터를 지우개되면??
        -- 그 없어질 데이터를 참조하고 있는 자식 테이블 때문에 에러가 발생함
        -- 따라서 지울 수가 없는대, 지울려면 2가지 방법이 있다.
        -- 1. 자식 테이블에서 해당 부모 테이블을 참조하는 데이터를 먼저 삭제한 뒤 부모테이블 데이터를 삭제한다.
        -- 2. casecade 키워드를 붙여 삭제한다.
         
         
         
  -- check )
  create table check_test(
    gender varchar2(10) not null constraint check_sex check(gender IN('M','F')) -- M,F만 입력 가능해짐
  );
   
  create table check_test2(
    gender varchar2(10) not null constraint check_sex check(gender IN('남성','여성')) -- 남성,여성만 입력 가능해짐
  );
   
  create table check_test3(
    score number(20) constraint score_check check(score between 0 and 100), -- 0~ 100 값만 입력 가능
    kor varchar2(10)
  );


+ Recent posts