IT Study/Database-Oracle

제약 조건 정리

도뿌리 2018. 6. 27. 10:02
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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
-- 무결성 제약조건
-- PRIMARY KEY : 기본키. NULL을 허용하지 않음, 중복을 허용하지 않음
           -- EX) 주민번호, ID
-- UNIQUE KEY : 고유키. NULL을 허용, 중복을 허용하지 않음.
           -- EX) E-mail
-- CHECK
-- FOREIGN KEY : 외래키. 다른 테이블에서 PRIMARY KEY인 경우 자주 있음
                -- NULL 허용
-- NOT NULL
 
-- NOT NULL
CREATE TABLE TB_TEST(
    COL1 VARCHAR2(10NOT NULL,
    COL2 VARCHAR2(20)
);
 
INSERT INTO TB_TEST( COL1,COL2 ) 
VALUES ('AAA','aaa');
 
INSERT INTO TB_TEST( COL1,COL2 ) 
VALUES ('AAA','');
 
-- COL1은 NULL을 허용하지 않음
INSERT INTO TB_TEST( COL1,COL2 ) 
VALUES ('','aaa');
 
SELECT * FROM TB_TEST;
 
-- PRIMARY KEY = NOT NULL + UNIQUE
-- 유일하게 식별할 수 있는 정의된 규칙
-- 최대 32개 컬럼까지 지정 가능 -- 2개
CREATE TABLE TEST_01(   -- CONSTRAINT (무결성 제약 조건)
    KEY_01 VARCHAR2(10CONSTRAINT PK_TEST_01 PRIMARY KEY,
    KEY_02 VARCHAR2(10),
    COL_01 VARCHAR2(20),
    COL_02 VARCHAR2(20)
);
 
INSERT INTO TEST_01(KEY_01,KEY_02,COL_01,COL_02)
VALUES ('AAA','aaa','111','111');
 
INSERT INTO TEST_01(KEY_01,KEY_02,COL_01,COL_02)
VALUES ('','aaa','111','111'); -- not null 에러(PRIMARY KEY)
 
INSERT INTO TEST_01(KEY_01,KEY_02,COL_01,COL_02)
VALUES ('AAA','aaa','111','111'); -- 중복 에러(PRIMARY KEY)
 
INSERT INTO TEST_01(KEY_01,KEY_02,COL_01,COL_02)
VALUES ('aaa','aaa','111','111');
 
DROP TABLE TEST_01
CASCADE CONSTRAINTS;    -- 무결성까지 삭제
 
-- 만들수 없다 (PK가 두개)
CREATE TABLE TEST_01 (
    KEY_01 VARCHAR2(10CONSTRAINT PK_TEST_01 PRIMARY KEY,
    KEY_02 VARCHAR2(10CONSTRAINT PK_TEST_02 PRIMARY KEY,
    COL_01 VARCHAR2(20),
    COL_02 VARCHAR2(20)
);
 
CREATE TABLE TEST_01 (
    KEY_01 VARCHAR2(10),
    KEY_02 VARCHAR2(10),
    COL_01 VARCHAR2(20),
    COL_02 VARCHAR2(20),
    CONSTRAINT PK_TEST_01 PRIMARY KEY(KEY_01,KEY_02)
    USING INDEX TABLESPACE USERS
);
 
INSERT INTO TEST_01(KEY_01,KEY_02,COL_01,COL_02)
VALUES ('AAA','aaa','111','');
 
INSERT INTO TEST_01(KEY_01,KEY_02,COL_01,COL_02)
VALUES ('AAA','','111',''); -- 안됨
 
INSERT INTO TEST_01(KEY_01,KEY_02,COL_01,COL_02)
VALUES ('AAA','AAA','111',''); -- 됨
 
 
DROP TABLE TEST_01
CASCADE CONSTRAINTS;
 
CREATE TABLE TEST_01 (
    KEY_01 VARCHAR2(10),
    KEY_02 VARCHAR2(10),
    COL_01 VARCHAR2(20),
    COL_02 VARCHAR2(20)
);
 
-- PRIMARY KEY 추가
ALTER TABLE TEST_01 
ADD
CONSTRAINT PK_TEST_01
PRIMARY KEY (KEY_01,KEY_02);
 
-- PRIMARY KEY 삭제
ALTER TABLE TEST_01
DROP
CONSTRAINT PK_TEST_01;
 
-- PRIMARTY KEY 확인 QUERY
SELECT *
FROM USER_CONSTRAINTS
WHERE TABLE_NAME = 'TEST_01'
    AND CONSTRAINT_TYPE = 'P';
    
-- UNIQUE KEY 고유키
-- NULL값을 제외한 유일하게 식별할 수 있는 키, 중복 허용 X
DROP TABLE TEST_01
CASCADE CONSTRAINTS;
 
CREATE TABLE TEST_01 (
    UKEY_01 VARCHAR2(10CONSTRAINT UK_TEST_01 UNIQUE,
    KEY_01 VARCHAR2(10),
    COL_01 VARCHAR2(20),
    COL_02 VARCHAR2(20)
);
 
INSERT INTO TEST_01(UKEY_01, KEY_01,COL_01,COL_02)
VALUES ('AAA','aaa','111','111');
 
INSERT INTO TEST_01(UKEY_01, KEY_01,COL_01,COL_02)
VALUES ('AAA','aaa','111','111'); -- 에러
 
INSERT INTO TEST_01(UKEY_01, KEY_01,COL_01,COL_02)
VALUES ('','aaa','111','111'); -- NULL값 넣어짐
 
DROP TABLE TEST_01
CASCADE CONSTRAINTS;
 
-- 다중 UNIQUE 
CREATE TABLE TEST_01 (
    KEY_01 VARCHAR2(10),
    KEY_02 VARCHAR2(10),
    COL_01 VARCHAR2(20),
    COL_02 VARCHAR2(20),
    CONSTRAINT PK_TEST_01 UNIQUE(KEY_01,KEY_02)
    USING INDEX TABLESPACE USERS
);
 
-- CHECK
-- 데이터의 값이 범위, 특정한 값의 지정이 가능하다
-- NULL 허용, 중복 허용
DROP TABLE TEST_01
CASCADE CONSTRAINTS;
 
CREATE TABLE TEST_01 (
    KEY_01 VARCHAR2(10),
    KEY_02 VARCHAR2(10),
    COL_01 VARCHAR2(20),
    COL_02 NUMBER,
    CONSTRAINT CHK_TEST_01 CHECK(COL_01 IN ('남자','여자')),
    CONSTRAINT CHK_TEST_02 CHECK(COL_02 >=1 AND COL_02<=99)
);
 
INSERT INTO TEST_01(KEY_01,KEY_02,COL_01,COL_02)
VALUES ('AAA','aaa','남자',52);
 
INSERT INTO TEST_01(KEY_01,KEY_02,COL_01,COL_02)
VALUES ('AAA','aaa','','');
 
INSERT INTO TEST_01(KEY_01,KEY_02,COL_01,COL_02)
VALUES ('AAA','aaa','없음',2); -- 체크안의값이 아니면 INSERT가 안됨
 
-- FOREIGN KEY
-- 다른 테이블의 기본키 이거나 고유키를 참조하는 속성 또는 속성의 집합
 
INSERT INTO EMPLOYEES(EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL,
            PHONE_NUMBER, HIRE_DATE, JOB_ID,SALARY, COMMISSION_PCT, MANAGER_ID, DEPARTMENT_ID)
VALUES (300,'DOKEUN','KIM','dobbury@naver.com',
        '020.314.4534',SYSDATE,'IT_PROG',90000,0.32,100,60);
 
ROLLBACK; --되돌리기
 
COMMIT; --커밋 후에는 롤백 안됨
 
-- 부모 테이블 PRIMARY KEY
CREATE TABLE TEST_PAR(
    KEY_01 VARCHAR2(10),
    KEY_02 VARCHAR2(10),
    COL_01 VARCHAR2(20),
    COL_02 VARCHAR2(20),
    CONSTRAINT PK_TEST_PAR PRIMARY KEY(KEY_01,KEY_02)    
);
 
-- 자식 테이블 FOREIGN KEY
CREATE TABLE TEST_CHD(
    KEY_01 VARCHAR2(10CONSTRAINT PK_TEST_CHD PRIMARY KEY,
    KEY_02 VARCHAR2(10),
    FK_KEY_01 VARCHAR2(10),   --기본키와 같은 크기로 잡아줘야 함
    FK_KEY_02 VARCHAR2(10),
    CONSTRAINT FK_TEST_CHD FOREIGN KEY(FK_KEY_01,FK_KEY_02) 
    REFERENCES TEST_PAR(KEY_01,KEY_02)
);
 
INSERT INTO TEST_PAR(KEY_01,KEY_02,COL_01,COL_02)
VALUES ('AAA','aaa','AAA','aaa');
 
INSERT INTO TEST_PAR(KEY_01,KEY_02,COL_01,COL_02)
VALUES ('BBB','bbb','BBB','bbb');
 
INSERT INTO TEST_CHD(KEY_01,KEY_02,FK_KEY_01,FK_KEY_02)
VALUES ('111','111','','');
 
INSERT INTO TEST_CHD(KEY_01,KEY_02,FK_KEY_01,FK_KEY_02)
VALUES ('222','111','BBB','');
 
INSERT INTO TEST_CHD(KEY_01,KEY_02,FK_KEY_01,FK_KEY_02)
VALUES ('333','111','CCC','');  --FOREIGN KEY는 NULL 허용하기 때문에
 
INSERT INTO TEST_CHD(KEY_01,KEY_02,FK_KEY_01,FK_KEY_02)
VALUES ('444','111','CCC','ccc');
 
SELECT *
FROM TEST_CHD;
 
cs