DBMS/๋ฐ์ดํฐ๋ฒ ์ด์ค ์ด๋ก
[DB] ๐ ํ ์ด๋ธ ์ ์ฝ ์กฐ๊ฑด ๐ต๏ธ ์ ๋ฆฌ
์ธํ_
2021. 11. 5. 20:26
ํ ์ด๋ธ ์ ์ฝ ์กฐ๊ฑด
- ํ
์ด๋ธ์ ๋ถ์ ์ ํ ์๋ฃ๊ฐ ์
๋ ฅ๋๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด์ ์ฌ๋ฌ๊ฐ์ง ๊ท์น์ ์ ์ฉํด ๋๋ ๊ฒ
- ๊ฐ๋จํ๊ฒ ๋งํ๋ฉด ํ
์ด๋ธ ์์์ ๋ฐ์ดํฐ์ ์ฑ๊ฒฉ์ ์ ์ํ๋ ๊ฒ.
1. NOT NULL ์กฐ๊ฑด
- ์ปฌ๋ผ์ ํ์ ํ๋ํ ์ํฌ ๋ ์ฌ์ฉ.
- NOT NULL ์ ์ฝ์กฐ๊ฑด ์ค์ ์ ํด๋น ์ปฌ๋ผ์๋ ๊ผญ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅํด์ผ ํจ.
-- emp3๋ผ๋ ํ
์ด๋ธ์ ๋ง๋ค๊ณ , ename ์ปฌ๋ผ์ ์ ์ฝ์กฐ๊ฑด๋ช
์ emp_nm_ename ์ผ๋ก ํ์ฌ NOT NULL ์ ์ฝ์กฐ๊ฑด์ ์ค์ ํ์.
SQL> CREATE TABLE emp3(
ename VARCHAR2(30) CONSTRAINT emp_nm_enmae NOT NULL
);
-- ์ ์ฝ์กฐ๊ฑด์ ํ์ธํ ๋๋ USER_CONSTRAINTS ๋ทฐ๋ฅผ ํตํด์ ํ์ธํ ์ ์๋ค.
SQL> SELECT CONSTRAINT_NAME
FROM USER_CONSTRAINTS
WHERE TABLE_NAME = 'EMP3';
CONSTRAINT_NAME
-----------------------
emp_nn_ename
2. UNIQUE ์กฐ๊ฑด
- ๋ฐ์ดํฐ์ ์ ์ผ์ฑ์ ๋ณด์ฅ(=> ์ค๋ณต๋๋ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ ์ ์์)ํ๊ณ , ์๋์ผ๋ก ์ธ๋ฑ์ค๊ฐ ์์ฑ.
- unique์ nullํ์ฉํ์ง๋ง, primary key๋ nullํ์ฉ ์ํจ
- unique์ ํ๋์ ํ ์ด๋ธ์ ์ฌ๋ฌ๊ฐ ์ฌ ์ ์์ง๋ง, primary key๋ ํ๋๋ง ์กด์ฌ
-- EMP2 ํ
์ด๋ธ์ ์์ฑํ ๋ค, ALTER ๋ฅผ ์ด์ฉํด์ ์ ์ฝ์กฐ๊ฑด์ ์ถ๊ฐํด์ค๋ค. (์ ์ฝ์กฐ๊ฑด๋ช
: EMP2_UK_DEPTNO)
ALTER TABLE EMP2
ADD CONSTRAINT EMP2_UK_DEPTNO UNIQUE(deptno);
-- ์ ์ฝ์กฐ๊ฑด์ ์ญ์ ํ๋ค.
ALTER TABLE EMP2
DROP CONSTRAINT EMP2_UK_DEPTNO;
3. CHECK ์กฐ๊ฑด
- ์ปฌ๋ผ์ ๊ฐ์ ์ด๋ค ํน์ ๋ฒ์๋ก ์ ํ
-- EMP2 ํ
์ด๋ธ์ comm ์ปฌ๋ผ์ด 1~100 ๊น์ง์ ๊ฐ๋ง ๊ฐ์ง ์ ์๋๋ก ์ฒดํฌ ์ ์ฝ์กฐ๊ฑด ์์ฑ.
ALTER TABLE EMP2
ADD CONSTRAINT EMP2_CK_COMM CHECK (comm >= 1 AND comm <= 100);
-- ์ ์ฝ์กฐ๊ฑด ์ญ์
ALTER TABLE EMP2
DROP CONSTRAINT EMP2_CK_COMM;
-- 10000, 20000, 30000, 40000, 50000 ์ ๊ฐ๋ง์ ๊ฐ์ง ์ ์๋ ์ฒดํฌ ์ ์ฝ์กฐ๊ฑด ์์ฑ.
ALTER TABLE EMP2
ADD CONSTRAINT EMP2_CK_COMM2 CHECK comm IN (10000,20000,30000,40000,50000);
4. DEFAULT (์ปฌ๋ผ ๊ธฐ๋ณธ๊ฐ) ์ง์
- ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅํ์ง ์์๋ ์ง์ ๋ ๊ฐ์ด ๊ธฐ๋ณธ์ผ๋ก ์ ๋ ฅ๋๋ค.
- default๋ผ๊ณ ๊ฐ์ ๋ช ์ํ๋ฉด ๊ธฐ๋ณธ๊ฐ์ด ๋ค์ด๊ฐ
- ์ด์ด๋ฆ์ด ๋ช ์๋์ง ์์ผ๋ฉด ์๋ ๊ธฐ๋ณธ๊ฐ
- ๊ฐ์ด ์ง์ ๋ช ๊ธฐ๋๋ฉด ๊ธฐ๋ณธ๊ฐ์ ๋ฌด์๋จ.
alter table ํ
์ด๋ธ๋ช
alter column ํ๋๊ฐ set default 10;
insert into ํ
์ด๋ธ๋ช
values("ํ๊ธธ๋","24",default,“180”);
-- hiredate ์ปฌ๋ผ์ ๊ฐ์ ์
๋ ฅํ์ง ์์๋ ์ค๋ ๋ ์ง๊ฐ ์
๋ ฅ๋๋ค.
SQL> CREATE TABLE emp4(
... (์ปฌ๋ผ์๋ต) ...,
hiredate DATE DEFAULT SYSDATE );
5. PRIMARY KEY ์ง์
- ๊ธฐ๋ณธํค : UNIQUE + NOT NULL ์ ๊ฒฐํฉ๊ณผ ๊ฐ์.
- ๊ธฐ๋ณธํค๋ ๊ทธ ๋ฐ์ดํฐ ํ์ ๋ํํ๋ ์ปฌ๋ผ์ผ๋ก์์ ์ญํ ์ ์ํํ์ฌ ๋ค๋ฅธ ํ ์ด๋ธ์์ ์ธ๋ํค๋ค์ด ์ฐธ์กฐํ ์ ์๋ ํค๋ก์์ ์๊ฒฉ์ ๊ฐ์ง๊ณ ์๋ค. => ์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ
- UNIQUE ์ ์ฝ์กฐ๊ฑด๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ธฐ๋ณธํค๋ฅผ ์ ์ํ๋ฉด ์๋์ผ๋ก ์ธ๋ฑ์ค๋ฅผ ์์ฑ, ๊ทธ ์ด๋ฆ์ ๊ธฐ๋ณธ ํค ์ ์ฝ์กฐ๊ฑด์ ์ด๋ฆ๊ณผ ๊ฐ๋ค.
โ INDEX:
๊ฒ์ ํค๋ก์ ๊ฒ์ ์๋๋ฅผ ํฅ์์ํจ๋ค. ( UNIQUE, PRIMARY KEY ์์ฑ์ ์๋์ ์ผ๋ก ์๊ธด๋ค.)
-- PRIMARY KEY ์์ฑ ์์ . ์ ์ฝ์กฐ๊ฑด๋ช
EMP5_PK_EMPNO
CREATE TABLE EMP5(
empno NUMBER CONSTRAINT EMP5_PK_EMPNO PRIMARY KEY
);
-- ํ
์ด๋ธ ์์ฑ ํ ALTER ๋ช
๋ น์ด๋ก PRIMARY KEY ์์ฑ ์์ .
ALTER TABLE EMP5
ADD CONSTRAINT EMP5_PK_EMPNO PRIMARY KEY (empno);
- ๋ง์ฝ ํ ์ด๋ธ์ ๊ฐ ํ๋๊ฐ์ ์ ๋ํฌํ ๊ฐ์ด ์๋ค๋ฉด, ํ๋ ๋ ๊ฐ๋ฅผ ๋ฌถ์ด์ primary key๋ก ์ง์ ๊ฐ๋ฅํ๋ค.
constraint pk_value primary key (ํ๋1,ํ๋2)
6. FOREIGN KEY (์ธ๋ํค) ์ง์
- ๊ธฐ๋ณธํค๋ฅผ ์ฐธ์กฐํ๋ ์ปฌ๋ผ or ์ปฌ๋ผ๋ค์ ์งํฉ (์ธ๋ํค๋ ๊ธฐ๋ณธํค๋ ์ ๋ํฌ๊ฐ ์๋๋ฉด ์์ฑ ์ ์ฝ)
- ์ธ๋ํค๋ฅผ ๊ฐ์ง๋ ์ปฌ๋ผ์ ๋ฐ์ดํฐ ํ์ ์ธ๋ํค๊ฐ ์ฐธ์กฐํ๋ ๊ธฐ๋ณธํค์ ์ปฌ๋ผ๊ณผ ๋ฐ์ดํฐ ํ์ด ์ผ์นํด์ผ ํ๋ค.
(์ด๋ฅผ ์ด๊ธฐ๋ฉด ์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ ์ ์ฝ์ ์ํด ํ ์ด๋ธ์ ์์ฑํ ์ ์์ !) - ์ธ๋ํค์ ์ํด ์ฐธ์กฐ๋๊ณ ์๋ ๊ธฐ๋ณธํค : ์ญ์ ๋ถ๊ฐ !!
- on update cascadeํ๋ฉด ๊ธฐ๋ณธํค๊ฐ ์์ ๋ ๊ฒฝ์ฐ ์ธ๋ํค๋ ๊ฐ์ด ์์ ํด์ค๋ค๋ ๋ง
- ON DELETE CASCADE ์ฐ์ฐ์์ ํจ๊ป ์ ์๋ ์ธ๋ํค์ ๋ฐ์ดํฐ๋ ๊ทธ ๊ธฐ๋ณธํค๊ฐ ์ญ์ ๋ ๋ ๊ฐ์ด ์ญ์ ๋๋ค
-- emp2 ํ
์ด๋ธ์ deptno ์ปฌ๋ผ์ด dept ํ
์ด๋ธ์ deptno ์ปฌ๋ผ์ ์ฐธ์กฐํ๋๋ก ์ธ๋ํค๋ฅผ ์์ฑํ์.
ALTER TABLE EMP2 ADD CONSTRAINT emp2_fk_deptno
FOREIGN KEY (deptno) REFERENCES TO DEPT(deptno);
/*
FOREIGN KEY ๋ค์ (deptno)๋ emp2 ํ
์ด๋ธ์ deptno ์ปฌ๋ผ
REFERENCES TO ๋ค์๋ ์ฐธ์กฐํ ํ
์ด๋ธ ๋ช
(์ฐธ์กฐํ ์ปฌ๋ผ) ์์๋ก ์จ์ค๋ค.
*/
์ ์ฝ์กฐ๊ฑด์ ํ์ธ
์ ์ฝ์กฐ๊ฑด์ ํ์ธํ ์ ์๋ ํ ์ด๋ธ์ USER_CONS_COLUMNS, USER_CONSTRAINTS ์ด๋ค.
USER_CONS_COLUMNS : ์ปฌ๋ผ์ ํ ๋น๋ ์ ์ฝ์กฐ๊ฑด ์กฐํ.
USER_CONSTRAINTS : ์ ์ ๊ฐ ์์ ํ ๋ชจ๋ ์ ์ฝ์กฐ๊ฑด ์กฐํ.
-- ํ
์ด๋ธ ์ด๋ฆ์ ์
๋ ฅํ์ ๋, ํด๋น ํ
์ด๋ธ์ ์ปฌ๋ผ๋ช
/ ์ ์ฝ์กฐ๊ฑด ์ข
๋ฅ / ์ ์ฝ์กฐ๊ฑด ์ด๋ฆ ์ ์ถ๋ ฅ.
SELECT A.COLUMN_NAME
, CASE WHEN B.CONSTRAINT_TYPE = 'C' THEN 'CHECK OR NOT NULL'
WHEN B.CONSTRAINT_TYPE = 'F' THEN 'FOREIGN KEY'
WHEN B.CONSTRAINT_TYPE = 'P' THEN 'PRIMARY KEY'
WHEN B.CONSTRAINT_TYPE = 'U' THEN 'UNIQUE KEY'
END AS CONSTRAINT_TYPE // DECODE ๋ฌธ์ ์จ๋ ๋์ง๋ง CASE ๋ฌธ๋ ์ฌ์ฉ ๊ฐ๋ฅํจ. ๋ง์ง๋ง์ END AS ๋ค์๋ ์๋ฆฌ์์ค๋ก ์ค ์ด๋ฆ ์จ์ฃผ๋ฉด ๋จ.
, A.CONSTRAINT_NAME
FROM USER_CONS_COLUMNS A, USER_CONSTRAINTS B
WHERE A.TABLE_NAME = UPPER('&table_name')
-- ์นํ๋ณ์ & ์ ์ฌ์ฉ(์คํ ์ ์
๋ ฅ์ฐฝ ๋ฌ๋ค. ์๋ฐ์ scanner ๊ฐ์ ๊ฒ.)
-- UPPER ๋ ๋๋ฌธ์๋ก ์นํ.
AND A.CONSTRAINT_NAME = B.CONSTRAINT_NAME
AND A.TABLE_NAME = B.TABLE_NAME;
-- ํ
์ด๋ธ ๋ช
์ ์
๋ ฅ ํ๋ฉด ๋ฉ๋๋ค.
table_name์ ๊ฐ์ ์
๋ ฅํ์ญ์์ค: emp
-- ๊ฒฐ๊ณผ
COLUMN_NAME CONSTRAINT_TYPE CONSTRAINT_NAME
----------- ---------------- ----------------
EMPNO CHECK OR NOT NULL SYS_C007071
Reference