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

https://velog.io/@sezzzini/DB

http://www.gurubee.net/lecture/1013