[SQL-์ค๋ผํด] ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ ์ ์ฝ์กฐ๊ฑด
๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ ์ ์ฝ์กฐ๊ฑด
์ฅ์
- ๋ฐ์ดํฐ์ ์ ํ์ฑ๊ณผ ์ผ๊ด์ฑ์ ๋ณด์ฅ
- ํ ์ด๋ธ ์์ฑ ์ ๋ฌด๊ฒฐ์ฑ ์ ์ฝ์กฐ๊ฑด์ ์ ์ ๊ฐ๋ฅ
- ํ ์ด๋ธ์ ๋ํด ์ ์, ๋ฐ์ดํฐ ๋์ ๋๋ฆฌ์ ์ ์ฅ๋๋ฏ๋ก ์์ฉ ํ๋ก๊ทธ๋จ์์ ์ ๋ ฅ๋ ๋ชจ๋ ๋ฐ์ดํฐ์ ๋ํด ๋์ผํ๊ฒ ์ ์ฉ
- ์ ์ฝ์กฐ๊ฑด์ ํ์ฑํ, ๋นํ์ฑํ ํ ์ ์๋ ์ตํต์ฑ
์ข ๋ฅ
๋ฌด๊ฒฐ์ฑ ์ ์ฝ์กฐ๊ฑด | ์ค๋ช |
NOT NULL | ํด๋น ์นผ๋ผ ๊ฐ์ NULL์ ํฌํจํ ์ ์์ |
๊ณ ์ ํค | ํ
์ด๋ธ ๋ด์์ ํด๋น ์นผ๋ผ ๊ฐ์ ํญ์ ์ ์ผํด์ผ ํจ NULL๊ฐ์ ํ์ฉ |
๊ธฐ๋ณธํค | ํด๋น ์นผ๋ผ ๊ฐ์ ๋ฐ๋์ ์กด์ฌํด์ผ ํ๋ฉฐ, ์ ์ผํด์ผ ํจ NOT NULL + ๊ณ ์ ํค ์ ์ฝ์กฐ๊ฑด |
์ฐธ์กฐ | ํด๋น ์นผ๋ผ ๊ฐ์ ์ฐธ์กฐ๋๋ ํ ์ด๋ธ์ ์นผ๋ผ ๊ฐ ์ค ํ๋์ ์ผ์นํ๊ฑฐ๋ NULL์ ๊ฐ์ง |
CHECK | ํด๋น ์นผ๋ผ์ ์ ์ฅ ๊ฐ๋ฅํ ๋ฐ์ดํฐ ๊ฐ์ ๋ฒ์๋ ์กฐ๊ฑด ์ง์ (๋๋ฉ์ธ ์ ์ฝ์กฐ๊ฑด) |
NOT NULL
- ํด๋น ์นผ๋ผ์ด NULL ๊ฐ์ ๊ฐ์ง ์ ์๋ค๋ ๊ฒ์ ์ ์
- ํด๋น ์นผ๋ผ์๋ ๋ฐ๋์ ๊ฐ์ ์ ๋ ฅํด์ผ ํ๊ณ , ์๋ตํ๋ฉด ์ค๋ฅ ๋ฐ์
- ๊ธฐ์กด ๋ฐ์ดํฐ๋ฅผ NULL๋ก ์์ ํ๋ ๊ฒฝ์ฐ์๋ ์ค๋ฅ ๋ฐ์
๊ณ ์ ํค
- ํ ํ ์ด๋ธ ๋ด ํด๋น ์นผ๋ผ์ด ๋์ผํ ๊ฐ์ ๊ฐ์ง ์ ์์์ ์ ์
- NULL์ ๊ณ ์ ํค ์ ์ฝ์กฐ๊ฑด์ ์๋ฐ๋์ง ์์์ผ๋ก ์ ๋ ฅ ๊ฐ๋ฅ
๊ธฐ๋ณธํค
- ํ๋ ์ด์์ ์นผ๋ผ์ ์ํด ํ ์ด๋ธ์ ๋ชจ๋ ํ์ ๊ตฌ๋ณํ๊ธฐ ์ํ ์๋ณ์๋ฅผ ์ ์
- ๊ณ ์ ํค ์ ์ฝ์กฐ๊ฑด๊ณผ NOT NULL ์ ์ฝ์กฐ๊ฑด์ ๊ฒฐํฉํ ๊ฐ๋
์ฐธ์กฐ
- ํ ํ ์ด๋ธ์ ์นผ๋ผ ๊ฐ์ด ์์ , ๋ค๋ฅธ ํ ์ด๋ธ์ ์นผ๋ผ ๊ฐ ์ค์ ํ๋์ ์ผ์น์ํค๊ธฐ ์ํ ์ ์ฝ์กฐ๊ฑด
- ์์ ํ ์ด๋ธ : ๋ค๋ฅธ ํ ์ด๋ธ์ ์นผ๋ผ ๊ฐ์ ์ฐธ์กฐํ๋ ํ ์ด๋ธ
- ๋ถ๋ชจ ํ ์ด๋ธ : ๋ค๋ฅธ ํ ์ด๋ธ์ ์ํด ์ฐธ์กฐ๋๋ ํ ์ด๋ธ
- ์ธ๋ํค : ๋ถ๋ชจ ํ ์ด๋ธ์ ์นผ๋ผ ๊ฐ์ ์ฐธ์กฐํ๋ ์์ ํ ์ด๋ธ์ ์นผ๋ผ
- ์ฐธ์กฐํค : ์์ ํ ์ด๋ธ์์ ์ฐธ์กฐํ๋ ๋ถ๋ชจ ํ ์ด๋ธ์ ์นผ๋ผ
DML ๋ช ๋ น๋ฌธ | ๋ถ๋ชจ ํ ์ด๋ธ | ์์ ํ ์ด๋ธ |
INSERT ์ฝ์ | ์ฐธ์กฐ ํค ๊ฐ์ด ๊ณ ์ ํ ๊ฒฝ์ฐ์๋ง ๊ฐ๋ฅ | ์ธ๋ ํค ๊ฐ์ด ์ฐธ์กฐ ํค ๊ฐ ์ค์ ํ๋์ ์ผ์นํ๊ฑฐ๋ NULL์ธ ๊ฒฝ์ฐ์ ๊ฐ๋ฅ |
UPDATE ์์ | ์ฐธ์กฐ ํค ๊ฐ์ ์ฐธ์กฐํ๋ ์์ ํ
์ด๋ธ์ ์นผ๋ผ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ์๋ง ๊ฐ์ผ |
์์ ๋๋ ์ธ๋ํค ๊ฐ์ด ์ฐธ์กฐ ํค ๊ฐ ์ค์ ํ๋์ ์ผ์นํ ๊ฒฝ์ฐ์ ๊ฐ๋ฅ |
DELETE ์ญ์ | ์ฐธ์กฐ ํค ๊ฐ์ ์ฐธ์กฐํ๋ ์์ ํ
์ด๋ธ์ ์นผ๋ผ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ์๋ง ๊ฐ๋ฅ 1. ๊ฑฐ์ 2. ์ฐ์ 3. NULL 4. DEFAULT |
ํญ์ ๊ฐ๋ฅ |
DELETE CASCADE |
ํญ์ ๊ฐ๋ฅ | ํญ์ ๊ฐ๋ฅ |
- cascade : ์ญ์ ๋๋ ์นผ๋ผ์ ์ฐธ์กฐํ๋ ์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ ์ ์ฝ์กฐ๊ฑด๋ ํจ๊ป ์ญ์
CHECK
- ์นผ๋ผ์์ ํ์ฉ ๊ฐ๋ฅํ ๋ฐ์ดํฐ์ ๋ฒ์๋ ์กฐ๊ฑด์ ์ง์
๋ฐ์ดํฐ ์ ๋ ฅ์ด๋ ์์ ์ ์ค์๋ก ๋ถ์ ํํ ๊ฐ์ ์ ๋ ฅ ์๋ฐฉ
- ํ๋์ ์นผ๋ผ์ ์ฌ๋ฌ ๊ฐ์ CHECK ๋ฌด๊ฒฐ์ฑ ์ ์ฝ์กฐ๊ฑด ์ง์ ๊ฐ๋ฅ
- ๊ฐ์ ์นผ๋ผ, ํจ์ ์ฌ์ฉ ๋ถ๊ฐ๋ฅ
๋ฌด๊ฒฐ์ฑ ์ ์ฝ์กฐ๊ฑด ์์ฑ
- ํ ์ด๋ธ ์์ฑ๊ณผ ๋์์ ์ ์ ๊ฐ๋ฅ
- ํ ์ด๋ธ ์์ฑ ์ดํ์ ์ถ๊ฐ, ์ญ์ ๊ฐ๋ฅ
- ์ ์ฝ์กฐ๊ฑด๋ช ์ ์ง์ ํ์ง ์์ผ๋ฉด SYS_Cn ํํ๋ก ์๋์์ฑ
create table ํ
์ด๋ธ๋ช
( ์นผ๋ผ๋ช
๋ฐ์ดํฐํ์
(๊ธธ์ด) [ ๊ธฐ๋ณธ๊ฐ ]
[ ์นผ๋ผ ์ ์ฝ์กฐ๊ฑด ],
[ ํ
์ด๋ธ ์ ์ฝ์กฐ๊ฑด ], [, ...]);
> ์ ์ฝ ์กฐ๊ฑด๋ช ์ง์ ์
create table ํ
์ด๋ธ๋ช
( ์นผ๋ผ๋ช
๋ฐ์ดํฐํ์
(๊ธธ์ด) constraint ์ ์ฝ์กฐ๊ฑด์ด๋ฆ primary key,
์นผ๋ผ๋ช
๋ฐ์ดํฐํ์
(๊ธธ์ด) constraint ์ ์ฝ์กฐ๊ฑด์ด๋ฆ NOT NULL,
์นผ๋ผ๋ช
๋ฐ์ดํฐํ์
(๊ธธ์ด) constraint ์ ์ฝ์กฐ๊ฑด์ด๋ฆ references ํ
์ด๋ธ๋ช
(์นผ๋ผ๋ช
),
์นผ๋ผ๋ช
๋ฐ์ดํฐํ์
(๊ธธ์ด) constraint ์ ์ฝ์กฐ๊ฑด์ด๋ฆ CHECK( ํ
์ด๋ธ๋ช
IN ( ์กฐ๊ฑด / ๋ฒ์ ));
- ์นผ๋ผ ๋ ๋ฒจ ์์ฑ
- ์นผ๋ผ ์ ์ ์ ํด๋น ์นผ๋ผ๋ณ๋ก ์ง์ ๊ฐ๋ฅ
- NOT NULL ๋ฌด๊ฒฐ์ฑ ์ ์ฝ์กฐ๊ฑด์ ์นผ๋ผ ๋ ๋ฒจ์์๋ง ์ ์ ๊ฐ๋ฅ
column_constraint : ==
{ [NOT] NULL
| primary key
| unique
| references ํ
์ด๋ธ๋ช
[( ์นผ๋ผ๋ช
[, ์นผ๋ผ๋ช
] ...)]
| check ( ์กฐ๊ฑด)};
- ํ ์ด๋ธ ๋ ๋ฒจ ์์ฑ
- ์ ์ฝ์กฐ๊ฑด์ด ํ๋ ์ด์์ ์นผ๋ผ์ ์ฐธ์กฐํ๊ฑฐ๋ ์ง์ ํ๋ ๊ฒฝ์ฐ ์ฌ์ฉ
- ํ๋์ ์นผ๋ผ์ ๋ ๊ฐ ์ด์์ ์ ์ฝ์กฐ๊ฑด์ ์ง์ ํ๋ ๊ฒฝ์ฐ ์ฌ์ฉ
talbe_constraint : ==
{{ unique | primary key} ( ์นผ๋ผ๋ช
[ , ์นผ๋ผ๋ช
] ...)
| primary key
| unique
| foreign key ( ์นผ๋ผ๋ช
[ , ์นผ๋ผ๋ช
] ...) references ํ
์ด๋ธ๋ช
[( ์นผ๋ผ๋ช
[, ์นผ๋ผ๋ช
] ...)]
| check (์กฐ๊ฑด)};
๋ฌด๊ฒฐ์ฑ ์ ์ฝ์กฐ๊ฑด ์ถ๊ฐ
ALTER TABLE ... ADD CONSTRAINT
- ๊ธฐ์กด ํ ์ด๋ธ์ ๋ํด์๋ ๋ฌด๊ฒฐ์ฑ ์ ์ฝ์กฐ๊ฑด์ ์ถ๊ฐ๋ก ์์ฑ ๊ฐ๋ฅ
- NULL ๋ฌด๊ฒฐ์ฑ ์ ์ฝ์กฐ๊ฑด์ ALTER ... ADD ๋ช ๋ น๋ฌธ์ผ๋ก ์ถ๊ฐ ๋ถ๊ฐ
alter table ํ
์ด๋ธ๋ช
add [ constraint ์ ์ฝ์กฐ๊ฑด์ด๋ฆ ] ์ ์ฝ์กฐ๊ฑดํ์
(์นผ๋ผ๋ช
);
์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ ์ ์ฝ์กฐ๊ฑด ์ถ๊ฐ
alter table ํ
์ด๋ธ๋ช
add constraint ์ ์ฝ์กฐ๊ฑด์ด๋ฆ foreign key ( ์นผ๋ผ๋ช
) references ์ฐธ์กฐํ๋ํ
์ด๋ธ๋ช
( ์นผ๋ผ๋ช
);
NULL ๋ฌด๊ฒฐ์ฑ ์ ์ฝ์กฐ๊ฑด ์ถ๊ฐ
ALTER TABLE ... MODIFY
- 'NULL ํ์ฉ' ์ํ๋ฅผ 'NULL ์ ๋ ฅ ๋ถ๊ฐ' ์ํ๋ก ๋ณ๊ฒฝํ๋ ๊ฒ์ ์๋ฏธ
- ALTER TABLE ... MODIFY ๋ช ๋ น๋ฌธ ์ฌ์ฉํ์ฌ NULL ์ํ ๋ณ๊ฒฝ ๊ฐ๋ฅ
alter table ํ
์ด๋ธ๋ช
modify ( ์นผ๋ผ๋ช
constraint ์ ์ฝ์กฐ๊ฑด์ด๋ฆ NOT NULL);
๋ฌด๊ฒฐ์ฑ ์ ์ฝ์กฐ๊ฑด ์ญ์
ALTER TABLE ... DROP CONSTRAINT
- ๋ถ๋ชจ ํ ์ด๋ธ์ ๊ธฐ๋ณธํค ๋ฌด๊ฒฐ์ฑ ์ ์ฝ์กฐ๊ฑด์ ์ญ์ ํ๋ ๊ฒฝ์ฐ
1. ์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ ์ ์ฝ์กฐ๊ฑด์ ๋จผ์ ์ญ์ ํ ํ ์ญ์ ํ๊ฑฐ๋ 2. CASCADE ์ต์ ์ฌ์ฉ
alter table ํ
์ด๋ธ๋ช
drop constraint ์ ์ฝ์กฐ๊ฑด์ด๋ฆ [cascade];
- cascade : ์ญ์ ๋๋ ์นผ๋ผ์ ์ฐธ์กฐํ๋ ์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ ์ ์ฝ์กฐ๊ฑด๋ ํจ๊ป ์ญ์
๋ฌด๊ฒฐ์ฑ ์ ์ฝ์กฐ๊ฑด ํ์ฑํ ๋ฐ ๋นํ์ฑํ
- ALTER TABLE ๋ช ๋ น๋ฌธ์์ ENABLE (ํ์ฑํ) ๋๋ DISABLE (๋นํ์ฑํ) ์ ์ฌ์ฉ
๋นํ์ฑํ
ALTER TABLE ... DISABLE
alter table ํ
์ด๋ธ๋ช
disable constraint ์ ์ฝ์กฐ๊ฑด์ด๋ฆ [cascade];
ํ์ฑํ
ALTER TABLE ... ENABLE
alter table ํ
์ด๋ธ๋ช
enable [novalidate] constraint ์ ์ฝ์กฐ๊ฑด์ด๋ฆ [cascade];
- novalidate : ๊ธฐ์กด ๋ฐ์ดํฐ์ ๋ํด์๋ ์ ์ฝ์กฐ๊ฑด์ ์ ์ฉํ์ง ์๊ณ ,
์๋ก ์ ๋ ฅ๋๋ ๋ฐ์ดํฐ๋ ์์ ํ๋ ๋ฐ์ดํฐ์ ๋ํด์๋ง ์ ์ฝ์กฐ๊ฑด์ ๊ฒ์ฌํ๊ธฐ ์ํ ์ต์
๋ฌด๊ฒฐ์ฑ ์ ์ฝ์กฐ๊ฑด ๊ฒ์ฌ ์์
์ฆ์ ์ ์ฝ์กฐ๊ฑด(immediate constraint) ๊ฒ์ฌ
- DML ๋ช ๋ น๋ฌธ์ ์คํํ ๋๋ง๋ค ๋ฌด๊ฒฐ์ฑ ์ ์ฝ์กฐ๊ฑด์ ์๋ฐ ์ฌ๋ถ๋ฅผ ๊ฒ์ฌ
- ์ ์ฝ์กฐ๊ฑด์ ์๋ฐํ ๊ฒฝ์ฐ DML ๋ช ๋ น๋ฌธ์ ROLLBACK ์ํค๊ณ ์ค๋ฅ ๋ฉ์์ง ์ถ๋ ฅ
- ์ ์ฝ์กฐ๊ฑด ์์ฑ ์ 'NOT DEFERRED' 'DEFERRABLE INITIALLY IMMEDATE'๋ก ์ง์ ๋ ๊ฒฝ์ฐ ์ฆ์ ์ ์ฝ์กฐ๊ฑด
์ง์ฐ ์ ์ฝ์กฐ๊ฑด(deffered constraint) ๊ฒ์ฌ
- ํธ๋์ญ์ ์ COMMIT ์์ ์ ๋ฌด๊ฒฐ์ฑ ์ ์ฝ์กฐ๊ฑด์ ์๋ฐ ์ฌ๋ถ๋ฅผ ๊ฒ์ฌ
- ํธ๋์ญ์ ๋ด์์ ์ ์ฝ์กฐ๊ฑด์ ์๋ฐํ DML ๋ช ๋ น๋ฌธ์ด ์๋ ๊ฒฝ์ฐ ํด๋น ํธ๋์ญ์ ์ ๋ชจ๋ ROLLBACK ์ํด
- ์ ์ฝ์กฐ๊ฑด ์์ฑ ์ 'DEFERRABLE INITIALLY DEFERRED'๋ก ์ง์ ๋ ๊ฒฝ์ฐ ์ง์ฐ ์ ์ฝ์กฐ๊ฑด
defer_spec :==
[ not deferrable | deferrable [initially {immediate | deferred}] ]
[ disable | enable [validate | novalidate] ]
๋ฌด๊ฒฐ์ฑ ์ ์ฝ์กฐ๊ฑด ์กฐํ
USER_CONSTRAINTS
- ์ ์ฝ์กฐ๊ฑด์ด ์ค์ ๋ ํ ์ด๋ธ ์ด๋ฆ, ๋ฌด๊ฒฐ์ฑ ์ ์ฝ์กฐ๊ฑด ์ด๋ฆ, ๋ฌด๊ฒฐ์ฑ ์ ์ฝ์กฐ๊ฑด ์ข ๋ฅ, ํ์ฑํ ์ํ์ ๋ณด ์ ์ฅ
select table_name, constraint_name, constraint_type, status
from user_constraints
where table_name = ' ๋๋ฌธ์ ํ
์ด๋ธ๋ช
'
[in('๋๋ฌธ์ ํ
์ด๋ธ๋ช
', '๋๋ฌธ์ ํ
์ด๋ธ๋ช
', ...)];
USER_CONS_COLUMNS
- ์ ์ฝ์กฐ๊ฑด์ด ์ค์ ๋ ์นผ๋ผ ์ด๋ฆ์ ์ ์ฅ
select table_name, column_name, constraint_name
from user_cons_colums
where table_name = ' ๋๋ฌธ์ ํ
์ด๋ธ๋ช
'
[in('๋๋ฌธ์ ํ
์ด๋ธ๋ช
', '๋๋ฌธ์ ํ
์ด๋ธ๋ช
', ...)];
์ฐธ๊ณ ๋์ : ์ค๋ผํด ์ค์ฌ์ SQL๋ฐฐ์ํฐ, ์ฐ์ฉํ ์ธ ๊ณต์ , ์๋ฅ์ถํ์ฌ, 2007๋