-
SQL - DDL ๋ช ๋ น์ด, ํ ์ด๋ธ ์์ฑ ์ ์ฝ์กฐ๊ฑดDATABASE 2020. 7. 24. 08:50
๐ฏ SQL DDL ๋ช ๋ น์ด CREATE, ALTER, DROP, RENAME, TRUNCATE ๋ฅผ ์์๋ณธ๋ค.
DDL( Data Definition Language )
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ตฌ์กฐ๋ฅผ ์์ฑ, ์์ , ์ญ์ ํ ์ ์๋ ์ธ์ด
์คํ๊ฒฐ๊ณผ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฆ๊ฐ ๋ฐ์๋๋ฉฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ ์ ์ ๋ณด๋ฅผ ๊ธฐ๋กํ๋ค.
์ค๋ผํด ๊ฐ์ฒด
์ค๋ผํด ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๊ฐ์ง ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋งํ๋ค.
DDL ๋ช ๋ น๋ฌธ ์ข ๋ฅ
CREATE ์์ฑ / ALTER ๋ณ๊ฒฝ / DROP ์ญ์ / RENAME ์ด๋ฆ๋ณ๊ฒฝ / TRUNCATE ์ ์ญ
ํ ์ด๋ธ ์์ฑ CREATE
CREATE TABLE [์คํค๋ง].ํ ์ด๋ธ๋ช (์ปฌ๋ผ๋ช ๋ฐ์ดํฐํ์ [DEFAULT ๊ฐ | ์ ์ฝ์กฐ๊ฑด]);
CREATE TABLE scott.emp (empno NUMBER(4), ename VARCHAR2(20), hiredate DATE, sal NUMBER(7,2));
์คํค๋ง
์ฌ์ฉ์๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์ฑํ ๊ฐ์ฒด๋ค์ ๋ํ ์ด๋ฆ์ด๋ฉฐ
์ฌ์ฉ์์ ๊ณ์ ๋ช ๊ณผ ๋์ผํ๋ค. SCOTT์ ์์ด๋ฉด SCOTT์ด ์คํค๋ง
์์ ์ ์คํค๋ง์ ์ํ ๊ฐ์ฒด์ ์ ๊ทผํ ๋ ์คํค๋ง๋ฅผ ์๋ตํ๊ธฐ ๋๋ฌธ์
๋ง์ฝ ๊ถํ์ ๊ฐ์ง๊ณ ๋ค๋ฅธ ๊ฐ์ฒด์ ์ ๊ทผํ๊ธฐ ์ํด์๋ ์คํค๋ง.๊ฐ์ฒด๋ช ํ์์ผ๋ก ์ฌ์ฉํด์ผ ํ๋ค.
๋ฐ๋ผ์ ๊ฐ์ฒด์ด๋ฆ์ ๊ฐํธํ๊ณ ์์๋ณด๊ธฐ ์ฝ๊ฒ ์ค์ ํ๋ ๊ฒ ์ข๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ฒด ์ด๋ฆ ์ง์ ๋ฐฉ๋ฒ
ํ ์ด๋ธ์ ๋ฐ์ดํฐํ์ ์ข ๋ฅ
LONGํ์ ์ VARCHAR2์ ๋น์ทํด๋ณด์ด์ง๋ง ํ๋์ ํ ์ด๋ธ์ ํ๋ฒ๋ง ์ฌ์ฉํ ์ ์๊ณ
NOT NULL ์ ์ฝ์กฐ๊ฑด ์ด์ธ์ ๋ค๋ฅธ ์ ์ฝ์กฐ๊ฑด์ ์ฌ์ฉํ ์ ์๋ค.
์ธ๋ฑ์ค, CTAS ๋ฐ SELECT๋ฌธ์์ WEHRE, GROUP BY, ORDER BY, DISTICT ๋ ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅํ๋ค.
DEFAULT ์ต์
INSERT๋ฌธ์ผ๋ก ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅํ ๋, ํด๋น ์ปฌ๋ผ์ ๊ฐ์ ์ง์ ํ์ง ์์ ๊ฒฝ์ฐ ์๋์ผ๋ก ๋๊ฐ์ด ์ ์ฅ๋๋ค.
DEFAULT๋ฅผ ์ฌ์ฉํ๋ฉด ์ปฌ๋ผ๊ฐ์ ์ง์ ํ์ง ์์๋ ์๋์ผ๋ก ๊ธฐ๋ณธ๊ฐ์ด ์ ๋ ฅ๋์ด NULL๊ฐ์ด ์ ์ฅ๋๋ ๊ฑธ ๋ง์ ์ ์๋ค.
๋ ์ง๋ ์ฑ๋ณ ๊ฐ์ ๊ณ ์ ๋ ๊ฐ๋ง ๊ฐ๋ ์ปฌ๋ผ์ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋๋ค.
-- ํ ์ด๋ธ ์์ฑ CREATE TABLE DEF_TABLE (NUM NUMBER(2), WRITEDAY DATE); CREATE TABLE DEF_TABLE2 (NUM NUMBER(2), WRITEDAY DATE DEFAULT SYSDATE); -- ๋ํดํธ์ต์ ์ ์ฉ -- ๋ฐ์ดํฐ ์ ๋ ฅ INSERT INTO DEF_TABLE(NUM) VALUES(1); -- ์ ์ฌ์ผ์ null ์ถ๋ ฅ INSERT INTO DEF_TABLE2(NUM) VALUES(1); -- ์ ์ฌ์ผ์ sysdate ์ถ๋ ฅ INSERT INTO DEF_TABLE2(NUM, WRITEDAY) VALUES (2, DEFAULT); -- ์ ์ฌ์ผ์ sysdate ์ถ๋ ฅ
CREATE TABLE EMP2 (EMPNO NUMBER(4), ENAME VARCHAR2(20), HIREDATE DATE DEFAULT SYSDATE, SAL NUMBER(7,2)); INSERT INTO EMP2(EMPNO, ENAME, SAL) VALUES (10, 'ํ๊ธธ๋', 3000); SELECT * FROM EMP2;
์ ์ฌ์ผ ์ปฌ๋ผ๊ฐ์ ๋ช ์์ ์ผ๋ก ์ ์ฅํ์ง ์์๋ ์๋์ผ๋ก ํ์ฌ ๋ ์ง๊ฐ์ ์ ์ฅํ๋๋ก ๋ํดํธ ์ต์ ์ ์ค์ ํ๋ค.
EMP2 ์ปฌ๋ผ์ค HIREDATE๋ง ๋นผ๊ณ ๋ฐ์ดํฐ๋ฅผ ์๋ก ์ ์ฅํด์ค๋ค.
ํ ์ด๋ธ ํ์ธํด๋ณด๋ฉด ์ ์ฌ์ผ์๋ null์ด ์๋ ํ์ฌ ๋ ์ง๊ฐ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ ์ฅ๋์ด ์๋๊ฑธ ์ ์ ์๋ค.
์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ด์ฉํ ํ ์ด๋ธ ์์ฑ
ํ ์ด๋ธ ์์ฑ ๋ฌธ๋ฒ์ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์กฐํฉํ ํํ๋ก ๋ฌธ์ฅ์ ์๊ธ์๋ฅผ ๋ฐ์ CTAS ์จํ์ค๋ผ๊ณ ํ๋ค.
ํ ์ด๋ธ์ ์ปฌ๋ผ์ด๋ฆ, ๋ฐ์ดํฐํ์ , NOT NULL ์ ์ฝ์กฐ๊ฑด๋ง ๋ณต์ฌ๋๊ณ , ์๋ณธํ ์ด๋ธ์ ์ธ๋ฑ์ค ๋ฐ ๋กฑํ์ ์ ๋ณต์ฌํ ์ ์๋ค.
CREATE TABLE DEPTA AS SELECT * FROM DEPT; SELECT COUNT(*) FROM DEPTA; -- DEPT๋ถ์์์ ๋ชจ๋ ๋ฐ์ดํฐ ๊ฐ์ ธ์์ ํ ์ด๋ธ ์์ฑ CREATE TABLE DEPTB(NO, NAME) AS SELECT DEPTNO, DNAME FROM DEPT; SELECT COUNT(*) FROM DEPTB; -- DEPT๋ถ์์์ ๋ ์ปฌ๋ผ์ ๋ฐ์ดํฐ๋ง ๊ฐ์ ธ์์ ํ ์ด๋ธ ์์ฑ CREATE TABLE DEPTC AS SELECT * FROM DEPT WHERE 1=2; SELECT COUNT(*) FROM DEPTC; -- DEPTํ ์ด๋ธ์์ ํ ์ด๋ธ ๊ตฌ์กฐ๋ง ๊ฐ์ ธ์ค๊ธฐ
์ ์ฝ์กฐ๊ฑด
ํ ์ด๋ธ์ ๋ถ์ ์ ํ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ ๊ฑธ ๋ฐฉ์งํ๊ธฐ ์ํด ํ ์ด๋ธ ์์ฑํ ๋ ๊ฐ ์ปฌ๋ผ์ ์ฌ๋ฌ๊ฐ์ง ์ ์ฝ์กฐ๊ฑด์ ์ ์ํ๋ค.
์ ์ฝ์กฐ๊ฑด ์ง์ ๋ฐฉ๋ฒ
1) ์ปฌ๋ผ๋ ๋ฒจ ์ง์
ํ ์ด๋ธ ์์ฑํ ๋ ์ปฌ๋ผ์ ์ ์ํ๋ฉด์ ๊ฐ์ด ์ ์ฝ์กฐ๊ฑด์ ์จ์ค๋ค. ํ๊ฐ์ ์ปฌ๋ผ์ ํ๋์ ์ ์ฝ์กฐ๊ฑด๋ง ์ ์ ๊ฐ๋ฅํ๋ฉฐ 5๊ฐ์ง ์ ์ฝ์กฐ๊ฑด ๋ชจ๋ ์ฌ์ฉํ ์ ์๋ค.
2) ํ ์ด๋ธ๋ ๋ฒจ ์ง์
๋ชจ๋ ์ปฌ๋ผ ์ ์ ํ ๋งจ ๋ง์ง๋ง์ ์ ์ฝ์กฐ๊ฑด์ ์ถ๊ฐํ์ฌ ํ ์ด๋ธ์ ์ปฌ๋ผ๊ณผ ๋ถ๋ฆฌํ์ฌ ์ ์ํ๋ค.
ํ๊ฐ ์ด์์ ์ปฌ๋ผ์ ํ๊ฐ์ ์ ์ฝ์กฐ๊ฑด ์ ์ ๊ฐ๋ฅ. NOT NULL ๋นผ๊ณ ๋๋จธ์ง 4๊ฐ์ ์ ์ฝ์กฐ๊ฑด์ ์ฌ์ฉํ ์ ์๋ค.
ํ ์ด๋ธ ์์ฑ๊ณผ ๋์์ ์ง์ ํ ์๋ ์๊ณ ํ ์ด๋ธ ์์ฑ ํ ์ถ๊ฐํ ์๋ ์๋ค.
user_constraints ๋ฐ์ดํฐ ์ฌ์ ์ด์ฉ
SELECT * FROM USER_CONSTRAINTS WHERE table_name='ํ ์ด๋ธ๋ช '; -- ํ ์ด๋ธ๋ช ์ ๋๋ฌธ์๋ก
user_constraints์ DATA DICTIONARY VIEW๋ฅผ ์กฐํํ๋ฉด ์ง์ ํ ์ด๋ธ์ ์ ์๋ ์ ์ฝ ์กฐ๊ฑด์ ๋ณผ ์ ์๋ค.
์ ์ฝ์กฐ๊ฑด์ CONSTRAINT_TYPE ์ปฌ๋ผ์์ P, R, U, C 4๊ฐ์ง ํํ๋ก ํ์๋๋ฉฐ NOT NULL ์ NULL๊ฐ์ ์ฒดํฌํ๋ ์กฐ๊ฑด์ผ๋ก ์ฒ๋ฆฌ๋๊ธฐ ๋๋ฌธ์ C๋ก ํํ๋๋ค.
PRIMARY KEY - PK
์ปฌ๋ผ์ ๊ธฐ๋ณธํค๋ฅผ ์ง์ ํ๋ฉด ํ ์ด๋ธ์์ ์๋ณ ๊ธฐ๋ฅ์ ๊ฐ๊ฒ ๋๋ค. ํ ์ด๋ธ๋น ํ๋์ ๊ธฐ๋ณธํค๋ง ๊ฐ์ง ์ ์์ผ๋ฉฐ ๊ฐ์ ์ ์ผํด์ผํ๊ณ (UNIQUE) ๋๊ฐ์ ๊ฐ์ง ์ ์๋ค(NOT NULL). ๋ฌด์กฐ๊ฑด ์ ์ผํ ๊ฐ์ด ๋ค์ด๊ฐ์ผ ํ๋ค. ํ๋์ ์ปฌ๋ผ๋ฟ๋ง ์๋๋ผ ์ฌ๋ฌ์ปฌ๋ผ(๋ณตํฉ์ปฌ๋ผ)์ ๊ธฐ๋ณธํค๋ก ๋ฌถ์ ์ ์๋ค.
-- ์ปฌ๋ผ๋ ๋ฒจ ๋ฐฉ์ CREATE TABLE [์คํค๋ง].ํ ์ด๋ธ๋ช ( ์ปฌ๋ผ๋ช ๋ฐ์ดํฐํ์ [CONSTRAINT ์ ์ฝ์กฐ๊ฑด๋ช ] PRIMARY KEY, ์ปฌ๋ผ๋ช ๋ฐ์ดํฐํ์ , ... ); -- ํ ์ด๋ธ ๋ ๋ฒจ ๋ฐฉ์ CREATE TABLE [์คํค๋ง].ํ ์ด๋ธ๋ช ( ์ปฌ๋ผ๋ช ๋ฐ์ดํฐํ์ , ์ปฌ๋ผ๋ช ๋ฐ์ดํฐํ์ , [CONSTRAINT ์ ์ฝ์กฐ๊ฑด๋ช ] PRIMARY KEY(์ปฌ๋ผ๋ช , ...) ); -- PRIMARY ํค ๋ค์์ ์ด๋ค ์ปฌ๋ผ์ด ๊ธฐ๋ณธํค์ ํด๋นํ๋์ง ๊ดํธ ์์ ์จ์ ์๋ ค์ค์ผํจ.
๊ธฐ๋ณธํค ์ ์ฝ์กฐ๊ฑด์ ์ง์ ํ๋ฉด ์๋์ผ๋ก UNIQUE INDEX๊ฐ ์ค์ ๋์ด์ ๊ธฐ๋ณธํค๋ฅผ ์ด์ฉํ ๋ฐ์ดํฐ ๊ฒ์์ด ๋น ๋ฅด๋ค.
์ ์ฝ์กฐ๊ฑด๋ช ์ ์๋ณ๊ฐ๋ฅํ๊ฒ, ์ค๋ณต๋์ง ์๊ฒ ์ ์ ์ผ๋ฉด ๋๋๋ฐ ๋ณดํต 'ํ ์ด๋ธ๋ช _์ปฌ๋ผ๋ช _pk ํ์์ผ๋ก ์ง์ ํ๋ค. CONSTRAINT ์ ์ฝ์กฐ๊ฑด๋ช ์ ์๋ตํ๋ฉด ์ค๋ผํด์์ ์๋์ ์ผ๋ก SYS_ ํ์์ผ๋ก ๋ง๋ค์ด์ฃผ๋๋ฐ ์ด๊ฑด ๋์ค์ ์์๋ณด๊ธฐ ๋ถํธํด์ง๊ธฐ ๋๋ฌธ์ ๋ช ์ํด๋๋ ๊ฒ ์ข๋ค.
-- ์ปฌ๋ผ๋ ๋ฒจ ๋ฐฉ์ CREATE TABLE PK_TAB1( ID NUMBER(2) CONSTRAINT PK_TAB1_ID_PK PRIMARY KEY, NAME VARCHAR2(10)); -- ํ ์ด๋ธ๋ ๋ฒจ ๋ฐฉ์ CREATE TABLE PK_TAB2( ID NUMBER(2), NAME VARCHAR2(10), CONSTRAINT PK_TAB2_ID_PK PRIMARY KEY(ID));
--์ปฌ๋ผ๋ ๋ฒจ๋ฐฉ์์ผ๋ก dept ํ ์ด๋ธ ์์ฑ CREATE TABLE DEPARTMENT (DEPTNO NUMBER(2) CONSTRAINT DEPARTMENT_DEPTNO_PK PRIMARY KEY, DNAME VARCHAR2(15), LOC VARCHAR2(15)); -- ํ ์ด๋ธ๋ ๋ฒจ ๋ฐฉ์ CREATE TABLE DEPARTMENT2 (DEPTNO NUMBER(2), DNAME VARCHAR2(15), LOC VARCHAR2(15), CONSTRAINT DEPARTMENT2_DEPTNO_PK PRIMARY KEY(DEPTNO) ); -- ํ ์ด๋ธ๋ ๋ฒจ๋ก ๋ณตํฉ์ปฌ๋ผ์ ์ ์ฝ์กฐ๊ฑด ์ ์ CREATE TABLE DEPARTMNET3 (DEPTNO NUMBER(2), DNAME VARCHAR2(15), LOC VARCHAR2(15), CONSTRAINT DEPARTMENT3_DEPTNO_PK PRIMARY KEY(DEPTNO, LOC) _; -- ์์ฑ๋ ์ ์ฝ ์กฐ๊ฑด ํ์ธํ๊ธฐ >> ๋ฐ์ดํฐ ์ฌ์ ์กฐํ SELECT * FROM USER_CONSTRAINTS WHERE table_name ='DEPARTMENT';
๋ฐ์ดํฐ์ฌ์ ์กฐํ ๊ฒฐ๊ณผ์์ CONSTRAINT_TYPE ์ปฌ๋ผ์ ๋ณด๋ฉด P ๋ผ๊ณ ํ์๋์ด์๋ค.
๊ทธ๋ฐ๋ฐ USER CONSTRAINTS ์ฌ์ ์์๋ ์ด๋ค ์ปฌ๋ผ์ ์ ์ฝ์กฐ๊ฑด ๊ฑธ๋ ค์๋์ง ์ ์ ์๋ค. ์ด๋ด ๋ USER_CONS_COLUMNS ๋ฐ์ดํฐ์ฌ์ ํ ์ด๋ธ์ ์ฌ์ฉํ๋ฉด ๋๋ค.
SELECT * FROM USER_CONS_COLUMNS WHERE table_name='DEPARTMENT';
์ด๊ฑธ๋ก ํด๋น column_name ์ปฌ๋ผ์ ํ์ธํ ์ ์๋ค.
NOT NULL (NN)
ํด๋น ์ปฌ๋ผ์ ๋๊ฐ์ด ์ ์ฅ๋๋ ๊ฑธ ๋ฐฉ์งํ๋ค.
NOT NULL ์ ์ฝ์กฐ๊ฑด์ ์ปฌ๋ผ๋ ๋ฒจ์์๋ง ์ง์ ๊ฐ๋ฅํ๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ์ปฌ๋ผ์ ๋๊ฐ์ ํ์ฉํ๋ค. NOT NULL ์ ์ฝ์กฐ๊ฑด์ ๋๊ฐ์ ํ์ฉํ๋ ์ด ๊ธฐ๋ณธ๋์์ ์์ ํ๋ ๊ฒ์ด์ง ์๋ก ์ถ๊ฐํ๋ ๊ฒ ์๋๋ค. ๋ฐ๋ผ์ ์ ์ฝ์กฐ๊ฑด์ ์ถ๊ฐํ๋ ๊ฒ๊ณผ ๋์ผํ ํ ์ด๋ธ๋ ๋ฒจ ๋ฐฉ์์ผ๋ก๋ not null์ ์ง์ ํ ์ ์๋ค. ๋๋จธ์ง 4๊ฐ๋ค์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ปฌ๋ผ์ ์๋ ์๋ก์ด ์ ์ฝ์กฐ๊ฑด์ ์ถ๊ฐํ๋ ๊ฑฐ๋ผ ์ปฌ๋ผ,ํ ์ด๋ธ ๋ ๋ฒจ์์ ๋ชจ๋ ์ฌ์ฉ๊ฐ๋ฅํ๋ค.
CREATE TABLE DEPARTMENT6 (DEPTNO NUMBER(2) CONSTRAINT DEPARTMENT6_DEPTNO_PK PRIMARY KEY, DNAME VARCHAR2(15) CONSTRAINT DEPARTMENT6_DNAME_UK UNIQUE, LOC VARCHAR2(15) CONSTRAINT DEPARTMENT6_LOC_NN NOT NULL); -- ์ด์ LOC์ NULL ๊ฐ์ ์ ์ฅํ๋ฉด ์๋ฌ๋๋ค.
UNIQUE - UQ
์ค๋ณต๋ถ๊ฐ ์ ์ฝ์กฐ๊ฑด์ ์ง์ ํ๋ค. ๊ธฐ๋ณธํค(PK)์๋ ๋ค๋ฅด๊ฒ ๋๊ฐ์ ํ์ฉํ๊ณ ํ ํ ์ด๋ธ์ ์ ๋ํฌ ์ ์ฝ์กฐ๊ฑด์ ์ฌ๋ฌ๊ฐ ์ง์ ํ ์ ์๋ค.
๋ณตํฉ์ปฌ๋ผ ์ง์ ์ ํ ์ด๋ธ๋ ๋ฒจ๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
-- ํ ์ด๋ธ ์์ฑ CREATE TABLE UNI_TAB1 ( DEPTNO NUMBER(2) CONSTRAINT UNI_TAB1_DEPTNO_UK UNIQUE, DNAME CHAR(14), LOC CHAR(13)); -- ์ปฌ๋ผ๋ ๋ฒจ ์ ์ฝ์กฐ๊ฑด ์ง์ CREATE TABLE UNI_TAB2 ( DEPTNO NUMBER(2), DNAME CHAR(14), LOC CHAR(13), CONSTRAINT UNI_TAB2_DEPTNO_UK UNIQUE (DEPTNO)); -- ํ ์ด๋ธ๋ ๋ฒจ ์ ์ฝ์กฐ๊ฑด ์ง์ -- ๋ฐ์ดํฐ ์ ๋ ฅ INSERT INTO UNI_TAB1 VALUES(1, 'A', 'A'); SELECT * FROM UNI_TAB1; INSERT INTO UNI_TAB2 VALUES (NULL, 'A', 'A'); -- NULL๊ฐ ์ถ๋ ฅ SELECT * FROM UNI_TAB2;
--์ปฌ๋ผ๋ ๋ฒจ ์ ๋ํฌ ์ ์ CREATE TABLE DEPARTMENT4 (DEPTNO NUMBER(2) CONSTRAINT DEPARTMENT4_DEPTNO_PK PRIMARY KEY, DNAME VARCHAR2(15) CONSTRAINT DEPARTMENT4_DNAME_UK UNIQUE, LOC VARCHAR2(15)); INSERT INTO DEPARTMENT4 (DEPTNO, DNAME, LOC) VALUES (30, NULL, '์์ธ'); SELECT * FROM DEPARTMENT4; -- ํ ์ด๋ธ๋ ๋ฒจ ์ ๋ํฌ ์ ์ CREATE TABLE DEPARTMENT5 (DEPTNO NUMBER(2) CONSTRAINT DEPARTMENT5_DEPTNO_PK PRIMARY KEY, DNAME VARCHAR2(15), LOC VARCHAR2(15), CONSTRAINT DEPARTMENT5_DNAME_UK UNIQUE(DNAME));
CREATE TABLE SAWON_2 ( S_NO NUMBER(2), S_NAME VARCHAR2(10) NOT NULL, S_EMAIL VARCHAR2(20) CONSTRAINT SAWON_S_EMAIL_UK UNIQUE); -- ์ปฌ๋ผ๋ ๋ฒจ INSERT INTO SAWON_2 VALUES(2, '๊น์ํ', 'kim@ooo.com'); SELECT * FROM SAWON_2; CREATE TABLE SAWON_3 (S_NO NUMBER(2), S_NAME VARCHAR2(10) NOT NULL, S_EMAIL VARCHAR2(20), CONSTRAINT SAWON_3_S_EMAIL_UK UNIQUE (S_EMAIL)); -- ํ ์ด๋ธ๋ ๋ฒจ
CHECK - CK
์กฐ๊ฑด๊ณผ ์ผ์นํ๋ ๋ฐ์ดํฐ๋ง ์ ์ฅํ๋ ์ ์ฝ์กฐ๊ฑด. '์ด๊ฒ๋ง ์ ๋ ฅํด๋ผ'
CHECK ๋ค์ ๊ดํธ ์์๋ ์กฐ๊ฑด์์ด ๋ค์ด๊ฐ๋ค.
IN์ฐ์ฐ์, AND/OR, ๋น๊ต์ฐ์ฐ์์ ํจ๊ป ์ฌ์ฉํ ์ ์๋ค.
-- ์ปฌ๋ผ๋ ๋ฒจ CREATE TABLE DEPARTMENT7 (DEPTNO NUMBER(2), DNAME VARCHAR2(15) CONSTRAINT DEPARTMENT7_DNAME_CK CHECK(DNAME IN('๊ฐ๋ฐ', '์ธ์ฌ')), LOC VARCHAR2(15)); -- ํ ์ด๋ธ๋ ๋ฒจ CREATE TABLE DEPARTMENT8 (DEPTNO NUMBER(2), DNAME VARCHAR2(15), LOC VARCHAR2(15), CONSTRAINT DEPARTMENT8_DNAME_CK CHECK(DNAME IN ('๊ฐ๋ฐ', '์ธ์ฌ')) );
DNAME ์ปฌ๋ผ ์ ์ฝ์กฐ๊ฑด์ '๊ฐ๋ฐ', '์ธ์ฌ' ๋ ์ค ํ๋๋ง ์ ๋ ฅ ๊ฐ๋ฅํ๊ฒ ์ค์ ํ๋ค.
FOREIGN KEY - FK
ํด๋น ํ ์ด๋ธ์์ ๋ค๋ฅธ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์ฐธ์กฐํ ๋ ์ฌ๋ฐ๋ฅธ ๊ฐ๋ง ์ฐธ์กฐํ๋๋ก ์ ์ฝํ๋ค.
์ด ํค์ ๋ํ ์๋ฃ๋ ๋ค๋ฅธ ํ ์ด๋ธ์ ์๋ค๋ ๋ป์์ ์ธ๋ํค ๋๋ ์ฐธ์กฐํค๋ผ๊ณ ๋ถ๋ฅธ๋ค.
EMP๊ฐ DEPT์์ ๋ถ์๋ฒํธ๋ก ์๋ฃ๋ฅผ ์ฐธ์กฐํด์จ๋ค(์ฐธ๊ณ ํด์ ์ฐพ์์จ๋ค).
์ ๋ณด๋ฅผ ์ฃผ๋ ์ ๋ฅผ ๋ถ๋ชจํ ์ด๋ธ, ์ ๋ณด๋ฅผ ๊บผ๋ด์ฐ๋ ์ ๋ฅผ ์์ํ ์ด๋ธ์ด๋ผ ํ๋๋ฐ,
๋ถ์๋ฒํธ์ ํด๋นํ๋ ์ ๋ณด๋ฅผ ์ฃผ๋ DEPT๊ฐ ๋ถ๋ชจํ ์ด๋ธ์ด ๋๋ค.
์ฌ๊ธฐ์ FOREIGN KEY๋ ์์์์ ๋ถ๋ชจ๋ฅผ ์ฐธ์กฐํ ๋ ์ฌ์ฉํ๋ค.
์ธ๋ํค๊ฐ ์ฐธ์กฐํ๋ ๋ถ๋ชจํ ์ด๋ธ์ ์ปฌ๋ผ๊ฐ์ ์ค๋ณต๋๋ฉด ์๋๋๊น ๊ธฐ๋ณธํค๋ก ์ง์ ๋์ด์ผ ํ๋ค.
์ด ์ธ๋ํค๋ ๊ธฐ๋ณธํค๊ฐ ๊ฐ๊ณ ์๋ ๋ฒํธ๋ฅผ ๊ฐ๊ฑฐ๋ NULL๊ฐ๋ง ๊ฐ์ง ์ ์๋ค.
-- ๋ ๋ฐฉ์ ์คํ์ผ์ด ๋ค๋ฅด๋๊น ์ฌ์ฉ์ ํท๊ฐ๋ฆฌ์ง ์๊ฒ ์ฃผ์ -- ์ปฌ๋ผ๋ ๋ฒจ CREATE TABLE [์คํค๋ง].ํ ์ด๋ธ๋ช (์ปฌ๋ผ๋ช ๋ฐ์ดํฐํ์ [CONSTRAINT ์ ์ฝ์กฐ๊ฑด๋ช ] REFERENCES ๋ถ๋ชจํ ์ด๋ธ๋ช (์ปฌ๋ผ๋ช ) ์ปฌ๋ผ๋ช ๋ฐ์ดํฐํ์ , ... ); -- ํ ์ด๋ธ๋ ๋ฒจ CREATE TABLE [์คํค๋ง].ํ ์ด๋ธ๋ช (์ปฌ๋ผ๋ช ๋ฐ์ดํฐํ์ , ์ปฌ๋ผ๋ช ๋ฐ์ดํฐํ์ , ... [CONSTRAINT ์ ์ฝ์กฐ๊ฑด๋ช ] FOREIGN KEY(์ปฌ๋ผ๋ช ) REFERENCES ๋ถ๋ชจํ ์ด๋ธ๋ช (์ปฌ๋ผ๋ช ) );
์ปฌ๋ผ๋ ๋ฒจ์ ์ ์ฝ์กฐ๊ฑด ์ง์ ์ REFERENCES(์ฐธ์กฐ) ํค์๋๋ฅผ ์ฌ์ฉํ๋ค. ์ฐธ์กฐํ๋ ๋ถ๋ชจํ ์ด๋ธ์ ์ปฌ๋ผ์ ๋ฐ๋์ ๊ธฐ๋ณธํค๋ ์ ๋ํฌ๋ก ์ ์ฝ์กฐ๊ฑด์ด ์ค์ ๋ ์ปฌ๋ผ์ด์ด์ผ ํ๋ค.
-- DEPTNO ์ปฌ๋ผ์ ๊ธฐ๋ณธํค๋ก ์ค์ ํ๋ ๋ถ๋ชจํ ์ด๋ธ ์์ฑ CREATE TABLE DEPT02 (DEPTNO NUMBER(2) CONSTRAINT DEPT02_DEPTNO_PK PRIMARY KEY, DNAME VARCHAR2(15), LOC VARCHAR2(15) ); INSERT INTO DEPT02 (DEPTNO,DNAME,LOC) VALUES (10,'์ธ์ฌ', '์์ธ'); INSERT INTO DEPT02 (DEPTNO,DNAME,LOC) VALUES (20,'๊ฐ๋ฐ', '๊ด์ฃผ'); INSERT INTO DEPT02 (DEPTNO,DNAME,LOC) VALUES (30,'๊ด๋ฆฌ', '๋ถ์ฐ'); INSERT INTO DEPT02 (DEPTNO,DNAME,LOC) VALUES (40,'์์ ', '๊ฒฝ๊ธฐ'); commit; -- ์์ DEPTNO ์ปฌ๋ผ์ ์ฐธ์กฐํ๋ ์ธ๋ํค๋ฅผ ๊ฐ๋ ์์ํ ์ด๋ธ ์์ฑ CREATE TABLE EMP02 (EMPNO NUMBER(4) CONSTRAINT EMP02_EMPNO_PK PRIMARY KEY, ENAME VARCHAR2(15), DEPTNO NUMBER(2) CONSTRAINT EMP02_DEPTNO_FK REFERENCES DEPT02(DEPTNO)); INSERT INTO EMP02 (EMPNO, ENAME, DEPTNO) VALUES (1000,'JOHN', 10); INSERT INTO EMP02 (EMPNO, ENAME, DEPTNO) VALUES (2000,'AWGDN', 20); INSERT INTO EMP02 (EMPNO, ENAME, DEPTNO) VALUES (3000,'BDDGF', NULL); INSERT INTO EMP02 (EMPNO, ENAME, DEPTNO) VALUES (4000,'WSEF', 50); --๋ฌด๊ฒฐ์ฑ ์ ์ฝ์กฐ๊ฑด ์๋ฐฐ ์๋ฌ commit; -- ์ ์ฝ์กฐ๊ฑด ํ์ธ SELECT TABLE_NAME, CONSTRAINT_TYPE, CONSTRAINT_NAME, R_CONSTRAINT_NAME FROM USER_CONSTRAINTS WHERE TABLE_NAME IN('DEPT02', 'EMP02'); -- DEPT02์ DEPTNO๋ฅผ ์ฐธ์กฐํ๋ ์ธ๋ํค๋ฅผ ๊ฐ๋ EMP03์ ์์ฑ CREATE TABLE EMP03 (EMPNO NUMBER(4) CONSTRAINT EMP03_EMPNO_PK PRIMARY KEY, ENAME VARCHAR2(15), DEPTNO NUMBER(2), CONSTRAINT EMP03_DEPTNO_FK FOREIGN KEY(DEPTNO) REFERENCES DEPT02(DEPTNO)); INSERT INTO EMP03 (EMPNO, ENAME, DEPTNO) VALUES (1000,'JOHN', 10); INSERT INTO EMP03 (EMPNO, ENAME, DEPTNO) VALUES (2000,'AWGDN', 20); INSERT INTO EMP03 (EMPNO, ENAME, DEPTNO) VALUES (3000,'BDDGF', NULL); INSERT INTO EMP03 (EMPNO, ENAME, DEPTNO) VALUES (4000,'WSEF', 50); -- errr commit; -- ์ ์ฝ์กฐ๊ฑด ํ์ธ SELECT TABLE_NAME, CONSTRAINT_TYPE, CONSTRAINT_NAME, R_CONSTRAINT_NAME FROM USER_CONSTRAINTS WHERE TABLE_NAME IN('DEPT02', 'EMP02','EMP03');
์ธ๋ํค ์ ์ฝ์กฐ๊ฑด์ ์ถ๊ฐ์ต์
๋ถ๋ชจํ ์ด๋ธ์ ํ ์ญ์ ์ ๋ฌธ์ ๋ ์ ์๋ ์์ํ ์ด๋ธ์ ํ ์ค์ ๋ฐฉ๋ฒ.
๋ถ๋ชจํ ์ด๋ธ์์ ๋ญ ์ญ์ ํ๋ฉด ์ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ๊ณ ์๋ ์์ํ ์ด๋ธ์ ๋ฌธ์ ๊ฐ ์๊ธด๋ค. ์ด๋ฐ ์ข ์์ ์ธ ์ํฉ์์ ํด๊ฒฐ ๊ฐ๋ฅํ ๋ฐฉ๋ฒ์ ๋ฌด์์ด ์์๊น?
1) ON DELETE CASCADE
๋ถ๋ชจ ํ ์ด๋ธ์ ํ์ด ์ญ์ ๋๋ฉด ํด๋น ํ์ ์ฐธ์กฐํ๋ ์์ํ ์ด๋ธ์ ํ๋ ๊ฐ์ด ์ญ์ ํ๋ ๋ฐฉ๋ฒ.
CREATE TABLE EMP02 (EMPNO NUMBER(4) CONSTRAINT EMP02_EMPNO_PK PRIMARY KEY, ENAME VARCHAR2(15), DEPTNO NUMBER(2) CONSTRAINT EMP02_DEPTNO_FK REFERENCES DEPT02(DEPTNO) ON DELETE CASCADE);
2) ON DELETE SET NULL
๋ถ๋ชจํ ์ด๋ธ์ ํ์ด ์ญ์ ๋๋ฉด ํด๋น ํ์ ์ฐธ์กฐํ๋ ์์ํ ์ด๋ธ์ ์ปฌ๋ผ๊ฐ์ NULL๋ก ์ค์ ํ๋ ๋ฐฉ๋ฒ.
CREATE TABLE EMP02 (EMPNO NUMBER(4) CONSTRAINT EMP02_EMPNO_PK PRIMARY KEY, ENAME VARCHAR2(15), DEPTNO NUMBER(2) CONSTRAINT EMP02_DEPTNO_FK REFERENCES DEPT02(DEPTNO) ON DELETE SET NULL);
ํ ์ด๋ธ ์ญ์ DROP
DROP TABLE ํ ์ด๋ธ์ด๋ฆ;
ํ ์ด๋ธ์ ์ ์ฅ๋ ๋ชจ๋ ๋ฐ์ดํฐ์ ๊ด๋ จ ์ธ๋ฑ์ค, ์ ์ฝ์กฐ๊ฑด(FK์ ์ธ)์ด ์ญ์ ๋๋ค.
์ฐธ์กฐํค๋ ์๋์ผ๋ก ์ญ์ ๋์ง ์๊ธฐ ๋๋ฌธ์ ์ฐธ์กฐ๋๋ ์ํฉ์ด๋ผ๋ฉด CASCADE CONSTRAINTS ์ต์ ์ ์ง์ ํด์ฃผ์ด์ผ ํ๋ค.
ํ ์ด๋ธ ์ด๋ฆ ๋ณ๊ฒฝ RENAME
RENAME ์์ ์ด๋ฆ TO ์์ด๋ฆ;
ํ ์ด๋ธ ์๋ผ๋ด๊ธฐ TRUNCATE
TRUNCATE TABLE ํ ์ด๋ธ๋ช ;
ํ ์ด๋ธ์ ์ญ์ ํ ๊ฒฝ์ฐ ๊ทธ๊ฑธ ๋ด์๋จ๋ ์ ์ฅ๊ณต๊ฐ์ ๊ทธ๋๋ก ์กด์ฌํ๋ค. ๋กค๋ฐฑ ๋ณต๊ตฌ๋ฅผ ์ํด์!
DELETE๋ช ๋ น์ ์ ์ฅ๊ณต๊ฐ์ ๋จ๊ฒจ๋๋๋ฐ, TRUNCATE๋ ๊ทธ ๊ณต๊ฐ๊น์ง ์์ ์ญ์ ํด๋ฒ๋ฆฌ๊ธฐ ๋๋ฌธ์ ๋กค๋ฐฑ์ด ๋ถ๊ฐ๋ฅํ๋ค.
๊ทธ๋์ ๋กค๋ฐฑ ์ ๋ณด๋ฅผ ๋ฐ์ํ์ง ์๊ธฐ ๋๋ฌธ์ DELETE๋ณด๋ค ์ํ์๋๊ฐ ๋น ๋ฅด๋ค.
FLASHBACK DROP
FLASHBACK TABLE ํ ์ด๋ธ๋ช TO BEFORE DROP;
์ญ์ ๋ ํ ์ด๋ธ ๋ณต๊ตฌํ๋ ๋ช ๋ น์ด.
์ผ๋จ ํ ์ด๋ธ์ ๋๋ํ๋ฉด RECYCLEBIN์ด๋ผ๋ ํน๋ณํ ๊ฐ์ฒด์ BIN$์ผ๋ก ์์ํ๋ ์ด๋ฆ์ผ๋ก ์ ์ฅ๋๋ค. ์ด์ ์ฌ๊ธฐ์ ๋ค์ ๋ณต๊ตฌ์ํฌ ์ ์๋ค.
SHOW RECYCLEBIN >> ๊ทธ ํด์งํต ๊ฐ์ฒด์ ๋ด๊ธด ์ ๋ณด ์กฐํ
PURGE RECYCLEBIN >> ํด์งํต ๋น์ฐ๊ธฐ
DROP TABLE ํ ์ด๋ธ๋ช PURGE ํ ์ด๋ธ ์์ ์ญ์ (๋ณต๊ตฌ๋ถ๊ฐ)
ํ ์ด๋ธ ๋ณ๊ฒฝ ALTER
์์ฑ๋ ํ ์ด๋ธ์ ๋ํ ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ๋ค.
์ปฌ๋ผ์ถ๊ฐ
ALTER TABLE ํ ์ด๋ธ๋ช ADD (์ปฌ๋ผ ๋ฐ์ดํํ์ [DEFAULT]);
ALTER TABLE EMP04 ADD (EMAIL VARCHAR2(10), ADDRESS VARCHAR2(20)); -- ์ด๋ฉ์ผ๊ณผ ์ฃผ์ ์ปฌ๋ผ์ ์ถ๊ฐ -- ์๋์ผ๋ก ๋๊ฐ์ผ๋ก ์ ์ฅ๋จ
์ปฌ๋ผ๋ณ๊ฒฝ
ALTER TABLE ํ ์ด๋ธ๋ช MODIFY (์ปฌ๋ผ ๋ฐ์ดํํ์ [DEFAULT]);
์ปฌ๋ผ์ ๋ฐ์ดํฐํ์ ๊ณผ ํฌ๊ธฐ, DEFAULT๊ฐ์ ๋ณ๊ฒฝํ ์์๋ค
ALTER TABLE EMP04 MODIFY (EMAIL VARCHAR2(40));
๋ฐ์ดํฐํ์ ์ ๋ณ๊ฒฝํ๊ฑฐ๋ ์ปฌ๋ผ์ ๊ธธ์ด๋ฅผ ์ฆ๊ฐ ๋๋ ์ถ์ํ๋ ๊ฒฝ์ฐ์๋ ๋ชจ๋ ํ์ ์ปฌ๋ผ์ด NULL์ด๊ฑฐ๋ ํ์ด ์๋ ๊ฒฝ์ฐ์๋ง ๊ฐ๋ฅํ๋ค.
์ปฌ๋ผ์ด๋ฆ ๋ณ๊ฒฝ
ALTER TABLE ํ ์ด๋ธ๋ช RENAME COLUMN ์๋์ด๋ฆ TO ์ ์ด๋ฆ;
์ปฌ๋ผ์ญ์
ALTER TABLE ํ ์ด๋ธ๋ช DROP(์ปฌ๋ผ);
ALTER TABLE EMP04 DROP (EMAIL);
์ ์ฝ์กฐ๊ฑด ์ถ๊ฐ
ALTER TABLE ํ ์ด๋ธ ADD [CONSTRAINT ์ ์ฝ์กฐ๊ฑด๋ช ] ์ ์ฝ์กฐ๊ฑดํ์ (์ปฌ๋ผ๋ช );
NOT NULL ์ ์ฝ์กฐ๊ฑด์ ALTER TABLE MODIFY๋ฌธ(์ปฌ๋ผ๋ ๋ฒจ)์ ์ฌ์ฉํ๋ค.
CREATE TABLE DEPT03 (DEPTNO NUMBER(2), DNAME VARCHAR2(15), LOC VARCHAR2(15)); -- ์์ฑ๋์ด ์๋ ํ ์ด๋ธ์ ๊ธฐ๋ณธํค ์ ์ฝ์กฐ๊ฑด์ ์ถ๊ฐํ๋ค. ALTER TABLE DEPT03 ADD CONSTRAINT DEPT03_DEPTNO_PK PRIMARY KEY(DEPTNO); -- ํ ์ด๋ธ์ NOT NULL ์ ์ฝ์กฐ๊ฑด์ ์ถ๊ฐํ๋ค. ALTER TABLE DEPT03 MODIFY(DNAME VARCHAR(15) CONSTRAINT DEPT03_DNAME_NN NOT NULL);
์ ์ฝ์กฐ๊ฑด ์ญ์
ALTER TABLE ํ ์ด๋ธ๋ช DROP PRIMARY KEY | UNIQUE(์ปฌ๋ผ)| CONSTRAINT ์ ์ฝ์กฐ๊ฑด๋ช [CASCADE];
ALTER TABLE DEPT03 DROP PRIMARY KEY; ALTER TABLE DEPT03 DROP CONSTRAINT DEPT03_DEPTNO_PK; ALTER TABLE DEPT03 DROP CONSTRAINT DEPT03_DNAME_NN; ALTER TABLE DEPT05 DROP PRIMARY KEY CASCADE;
PRIMARY KEY ๋๋ UNIQUE๋ CONSTRAINT ์ ์ฝ์กฐ๊ฑด๋ช ์์ด ํค์๋๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ค. ๋๋จธ์ง ์ ์ฝ์กฐ๊ฑด์ ์ ์ฝ์กฐ๊ฑด๋ช ์ ๋ช ์ํด์ ์ญ์ ํ๋ค. ์ข ์ ์ํ์ผ ๊ฒฝ์ฐ์ CASCADE ์ต์ ์ ์ฌ์ฉํ๋ค.
์ ์ฝ์กฐ๊ฑด ํ์ฑํ / ๋นํ์ฑํ
ALTER TABLE ํ ์ด๋ธ๋ช DISABLE|ENABLE CONSTRAINT ์ ์ฝ์กฐ๊ฑด๋ช [CASCADE]; -- ๋ฐ์ดํฐ ์ฌ์ ์ STATUS ์ปฌ๋ผ์์ ์ ์ฝ์กฐ๊ฑด ํ์ฑํ ์ํ๋ฅผ ๋ณผ ์ ์๋ค. SELECT TABLE_NAME, CONSTRAINT_TYPE, CONSTRAINT_NAME, STATUS FROM USER_CONSTRAINTS WHERE TABLE_NAME IN ('ํ ์ด๋ธ๋ช ');
๋ฐ์ดํฐ์ ์ ์ฅ์ฑ๋ฅ ํฅ์์ ์ํด ์ ์ฝ์กฐ๊ฑด์ ON/ OFF ํ ์ ์๋ค.
๐ NEXT : SQL ๋ทฐ, ์ํ์ค, ์ธ๋ฑ์ค ๊ฐ์ฒด์ ์ฌ์ฉ์ ๊ด๋ฆฌ ๊ณต๋ถํ๊ธฐ
๋ฐ์ํ'DATABASE' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
SQL - ๋ทฐ, ์ํ์ค, ์ธ๋ฑ์ค, ์ฌ์ฉ์ ๊ด๋ฆฌ (0) 2020.07.25 SQL - DML, ํธ๋์ญ์ TCL (0) 2020.07.23 SQL ์กฐ์ธ, ์๋ธ์ฟผ๋ฆฌ ์ฐ์ต๋ฌธ์ ํ์ด๋ณด๊ธฐ (0) 2020.07.22 SQL - Join, ์๋ธ์ฟผ๋ฆฌ (0) 2020.07.21 SQL - ๊ทธ๋ฃนํจ์, GROUP BY์ , HAVING์ (0) 2020.07.20