๐ ์ ์ฉํ ์ ๋ณด
๋ฐ์ดํฐ ๋์ ๋๋ฆฌ ์กฐํ
select * from user_tables;
select * from tab;
select * from USER_TAB_COLUMNS;
select * from USER_INDEXES;
select * from user_cons_columns;
๐กํผ๋๋ฐฑ Tip
ALTER TABLE ํ
์ด๋ธ์ด๋ฆ
DROP CONSTRAINT ์ ์ฝ์ฌํญ์ด๋ฆ;
์ ์ฝ ์ฌํญ๋ง ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ
ALTER TABLE ํ
์ด๋ธ์ด๋ฆ
ADD CONSTRAINT ์ ์ฝ์ฌํญ์ด๋ฆ ์ ์ฝ์กฐ๊ฑด;
OAUTH
์ธ์ฆ ํ์ฉ ๋์
DB ๋ชจ๋ธ๋ง ์, ์ ์ฝ ์ฌํญ์ ์ ๊ฑธ์
๐ Constraint (์ ์ธ์ ๋ฌด๊ฒฐ์ฑ ์ ์ฝ ์ฌํญ)
์ ์ธ์ ๋ฌด๊ฒฐ์ฑ ์ ์ฝ์ฌํญ : ์ ์
/ ์ ์ธ
๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ

โญ ๋ฌด๊ฒฐ์ฑ ์ ์ฝ์ฌํญ ๊ตฌํ ๋ฐฉ๋ฒ 3๊ฐ์ง โญ
โ ์ ์ธ์ ๋ฌด๊ฒฐ์ฑ ์ ์ฝ์ฌํญ(Declarative Integrity Constraint)
* DBMS์์ ํ
์ด๋ธ ์ ์ ์ P.K, U.K ๋ฑ ์ ์ฝ์ฌํญ ์ ์
โก Trigger (PL/SQL)
* DBMS ๋ ๋ฒจ์์ PK/SQL ์ผ๋ก ์ ์ฝ์ฌํญ ๋ก์ง ๊ตฌํ
โข Application Logic (Coding)
* JAVA, C (์ดํ๋ฆฌ์ผ์ด์
๋ ๋ฒจ์์ ์ ์ฝ์ฌํญ ๊ตฌํ)
โ ๋ฌด๊ฒฐ์ฑ ์ ์ฝ์ฌํญ์ ๊ตฌํ ๋ฐ ๊ฒ์ฆ์, ์ดํ๋ฆฌ์ผ์ด์
, DBMS ๋ ๋ฒจ ๊ฐ๊ฐ ๋ชจ๋ ์ด์ค์ผ๋ก ๊ตฌํํ๋ ๊ฒ์ด ์ข๋ค.
์ ์ธ์ ๋ฌด๊ฒฐ์ฑ ์ ์ฝ์ฌํญ
์ ์ธ์ ์ด๋ ํ๋ก๊ทธ๋จ ์ฝ๋ฉ์ ํ์ง ์๊ณ ํ
์ด๋ธ ์์ฑ์ ๋๋ ์์ฑํ ์ปฌ๋ผ์ด๋ ํ
์ด๋ธ์ ๋ฌด๊ฒฐ์ฑ ์ ์ฝ์ฌํญ์ ํ๊ธฐํ์ฌ ์ ์(define)ํ๋ ๋ฐฉ์
โ PRIMARY KEY : ๋ํ์ฑ(์ฌ๋ฌ ํ๋ณดํค ๋ค ์ค), ๊ณ ์ ์ฑ, ์กด์ฌ์ฑ(Not NULL)์ ๋ณด์ฅํ๋ฉฐ ํ
์ด๋ธ๋น 1๊ฐ๋ง ์ ์,
Unique Index ์๋ ์์ฑ , Unique Key
+ NOT NULL
์ ๊ฒฐํฉํํ
ex) ์์ด๋
โก UNIQUE KEY : ๋ฐ์ดํฐ์ ๊ณ ์ ์ฑ ๋ณด์ฅ, ํ
์ด๋ธ์ N๊ฐ์ ์ ์ ๊ฐ๋ฅ,
NULL ํ์ฉ,Unique Index ์๋ ์์ฑ
ex) email, ํด๋์ ํ ๋ฒํธ ๋ฑ
โข CHECK : ๊ฐ์ ๋ฒ์ ๋ ์กฐ๊ฑด์ ์ง์ ,Boolean ์ฐ์ฐ
โฃ NOT NULL : NULL(๊ฑ์ธก์น)์ ํ์ฉํ์ง ์๋ ํ์ ์
๋ ฅ ์ฌํญ ์ ์
โค FOREIGN KEY : ํ
์ด๋ธ ๊ฐ์ฒด๊ฐ์ ์ฐธ์กฐ ๊ด๊ณ ์ ์, ๋ด์ฉ์ ์ํ ์ฐธ์กฐ
Primary Key๋ ํ ์ด๋ธ ๋น 1๊ฐ, Unique Key๋ ํ ์ด๋ธ๋น ์ฌ๋ฌ๊ฐ๋ฅผ ๊ฐ์ง ์ ์๋ค. โ Primary Key์ ๋ํ์ฑ
- ํ์ ์ ๋ณด ์ค ์ ์ผ์ฑ์ ๊ฐ์ง ํ๋ณดํค
ex)
ID
,SocialNo
,Email
,PhoneNo
๋ฑ- ํฌํธ ์ฌ์ดํธ์์์ ๊ธฐ๋ณธํค : ID
- OAUTH์์์ ๊ธฐ๋ณธํค : Email
- ๊ตญ๊ฐ ๊ธฐ๊ด ํํ์ด์ง์์์ ๊ธฐ๋ณธํค : SocialNo
โ ์ด์ฒ๋ผ ๊ธฐ๋ณธ ํค๋ ์ฌ์ฉ์ฒ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์๋ค.
LEVEL ๊ณผ ์์ฑ์๊ธฐ LEVEL โ TABLE : ํ ์ด๋ธ์ ์ ์ํ๋ ์ ์ฝ ์ฌํญ์ผ๋ก ์ฌ๋ฌ ์ปฌ๋ผ์ด ์ ์ฝ ์ฌํญ์ ๊ด์ฌํ๋ ๊ฒฝ์ฐ ์ฌ์ฉ โก COLUMN : ํน์ ์ปฌ๋ผ์ ์ ์ํ๋ ์ ์ฝ ์ฌํญ ์์ฑ ์๊ธฐ โ TABLE ์์ฑ์ ์์ฑ โก TABLE ์์ฑํ ์์์ ์์ ์ ์ถ๊ฐ
NOT NULL
CREATE TABLE CUSTOMER2(
ID VARCHAR2(8) NOT NULL, -- NOT NULL ์ ์ฝ ์ฌํญ ์ ์
PWD VARCHAR2(8) CONSTRAINT CUSTOMER_PWD_NN NOT NULL, -- ํด๋น ์ ์ฝ ์ฌํญ์ ์ด๋ฆ์ ๋ช
์
NAME VARCHAR2(20), -- ์ด๋ฆ
SEX CHAR(1), -- ์ฑ๋ณ [M|F] M:Male F: Female
AGE NUMBER(3) -- ๋์ด
);
DESC CUSTOMER2

- NOT NULL์ ์ผ๋ฐ์ ์ผ๋ก ์ ์ฝ ์ฌํญ์ ์ด๋ฆ์ ๊ตณ์ด ๋ถ์ด์ง๋ ์๋๋ค.
- ์ ์ฝ ์ฌํญ์ ์ด๋ฆ์ ๋ถ์ฌํ์ง ์์ผ๋ฉด DBMS๊ฐ ์์๋ก ์ค์ ํ๋ค.
โก
INSERT INTO CUSTOMER(ID,PWD,NAME,SEX, AGE) VALUES('xman','ok','kang', 'M',21);
INSERT INTO CUSTOMER(ID,PWD,NAME,SEX,AGE) VALUES('XMAN','no','kim', 'T',-20);

- ์ ์์ ์ ๋ ฅ
โข
INSERT INTO CUSTOMER(ID,NAME,AGE) VALUES('zman','son',99);
INSERT INTO CUSTOMER(ID,PWD,NAME,AGE) VALUES('rman',NULL,'jjang',24);
INSERT INTO CUSTOMER(ID,PWD,NAME,AGE) VALUES('', 'pwd' ,'jjang',24);

- PWD,SEX ์ปฌ๋ผ์ ์์์ /๋ช ์์ NULL์ ์ฝ์ ํ๋ ค ํ์ง๋ง PWD์ปฌ๋ผ์ NOT NULL ์ ์ฝ์ฌํญ์ผ๋ก INSERT๋ ์๋ฌ ๋ฐ์.
- DML ์ฐ์ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํจ์ ๋ฐ๋ผ ๋ถ์ ์ ํ ๋ฐ์ดํฐ๊ฐ ๋ฐ์ํ ์ ์๋ค. DML ์ฐ์ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝ ํ๊ธฐ์ ์ ๋ฌด๊ฒฐ์ฑ ์ ์ฝ์ฌํญ์ ์๋ฐํ๋์ง ์ฌ๋ถ๋ฅผ ์ ๊ฒํ ํ ๋ฌด๊ฒฐ์ฑ ์ ์ฝ์ฌํญ์ ์๋ฐํ๊ฒ ๋๋ฉด ํด๋น DML ์ฐ์ฐ์ ์ํํ์ง ์๊ณ ์ทจ์ ์ฒ๋ฆฌ.
โฃ
UPDATE CUSTOMER SET PWD = NULL WHERE ID = 'XMAN'; -- ID๊ฐ XMAN์ธ ROW๋ง ์์
SELECT * FROM CUSTOMER;

- UPDATE์ฐ์ฐ์ PWD์
NOT NULL
์ ์ฝ์ฌํญ์ผ๋ก ์๋ฌ๊ฐ ๋ฐ์

โค ๋ฐ์ดํฐ๋์ ๋๋ฆฌ(์์คํ ์นดํ๋ก๊ทธ)์์ ์ ์ฝ์ฌํญ ํ์ธํ๊ธฐ
-- CUSTOMER2 ํ
์ด๋ธ์ ๋ํ ์ ์ฝ ์ฌํญ ํ์ธ
SELECT TABLE_NAME,CONSTRAINT_NAME,CONSTRAINT_TYPE,SEARCH_CONDITION
FROM USER_CONSTRAINTS
WHERE TABLE_NAME = 'CUSTOMER';
--
SELECT TABLE_NAME,CONSTRAINT_NAME,POSITION,COLUMN_NAME
FROM USER_CONS_COLUMNS
WHERE TABLE_NAME = 'CUSTOMER' ORDER BY CONSTRAINT_NAME,POSITION;


CHECK
- ์ค์ ๋ ์กฐ๊ฑด์ ์ฒดํฌํ์ฌ Boolean ๊ฒฐ๊ณผ๊ฐ TRUE์ธ ๊ฒฝ์ฐ์๋ง DML์ฐ์ฐ ํ์ฉ.
โ ํ ์ด๋ธ ์์ฑํ ์ ์ฝ์ฌํญ ์ถ๊ฐ
ALTER TABLE CUSTOMER ADD CONSTRAINT CUSTOMER_SEX_CK CHECK (SEX IN ('M','F')); -- ์กฐ๊ฑด

- SQL ์ค๋ฅ: ORA-02293: (SCOTT.CUSTOMER_SEX_CK)์ ๊ฒ์ฆํ ์ ์์ต๋๋ค.
- ์๋ชป๋ ์ ์ฝ ์ฌํญ ํ์ธ
โก
UPDATE CUSTOMER SET SEX='M' WHERE SEX='T';
COMMIT;
ALTER TABLE CUSTOMER ADD CONSTRAINT CUSTOMER_SEX_CK CHECK (SEX IN ('M','F'));
- ์ ์ฝ์ฌํญ ์ถ๊ฐ์ ๊ธฐ์กด์ ๋ฐ์ดํฐ์ ๋ํ ๋ฌด๊ฒฐ์ฑ ๊ฒ์ฌ.
- ๊ธฐ์กด ๋ฐ์ดํฐ๊ฐ ์ถ๊ฐ๋๋ ์ ์ฝ์ฌํญ์ ์๋ฐํ์ฌ ์๋ฌ๊ฐ ๋ฐ์ํ์ฌ ๋ฐ์ดํฐ ์ฒ๋ฆฌํ ์ ์ฝ์ฌํญ์ ์ถ๊ฐํ๋ค.
โข
INSERT INTO CUSTOMER(ID,PWD,NAME,SEX, AGE) VALUES('xman','ok','kang', 'M',21);
INSERT INTO CUSTOMER(ID,PWD,NAME,SEX,AGE) VALUES('xman','ok', 'jjang','M',20);
- ID๊ฐ ์ค๋ณต๋์ง๋ง ์ ๋ ฅ
โฃ
INSERT INTO CUSTOMER(ID,PWD,NAME,AGE) VALUES('asura','ok', 'joo',99);
-์ฑ๋ณ(SEX) ์ปฌ๋ผ์ NOT NULL ์ ์ฝ์ฌํญ์ด ์๊ธฐ ๋๋ฌธ์ NULL ์ ๋ ฅ. โ CHECK( IN(โMโ, โFโ))์ ์ ์ฝ์ฌํญ์ ์ถ๊ฐํ์ง๋ง, NULL์ ๊ฑฐ๋ฅด์ง ๋ชปํ๋ค.
โ NULL์ ๋ํ ์ ์ฝ์ฌํญ์ ๊ผญ NOT NULL์ ํตํด์๋ง ๊ฐ๋ฅํ๋ค.
โค
INSERT INTO CUSTOMER(ID,PWD,NAME,SEX,AGE) VALUES('harisu','ok', 'susu','T',33);

-์ฑ๋ณ(SEX) ์ปฌ๋ผ์ Check ์ ์ฝ์ฌํญ์ผ๋ก M ๊ณผ F๋ง ์ ๋ ฅ ๊ฐ๋ฅ ์๋ฌ๋ฐ์
โฅ
INSERT INTO CUSTOMER(ID,PWD,NAME,SEX,AGE) VALUES('shinsun','ok', '๋์ฌ', 'M',999);
- AGE์ปฌ๋ผ์ NUMBER(3)์ผ๋ก ์ ์๋์ด 999๊ฐ ์ ๋ ฅ๋๋ค.
โฆ
UPDATE CUSTOMER SET AGE = AGE + 1;



- 1๋ ์ด ์ง๋ ๊ณ ๊ฐ์ ๋์ด๋ฅผ +1 ํ๋ ค๊ณ UPDATE ์ฐ์ฐ์ ์ํํ๋๋ฐ ํ์ shisun์ 1000์ผ๋ก ์๋ฆฌ์๋ฅผ ์ด๊ณผํ๋ ์๋ฌ๊ฐ ๋ฐ์ํ์ฌ ๋ฌธ์ฅ ์์ค ๋กค๋ฐฑ(Statement Level Rollback) ๋ฐ์.
Unique Key

- ์ปฌ๋ผ ๋ฐ์ดํฐ์ ๊ณ ์ ์ฑ์ ๋ณด์ฅํ๊ณ
NULL
์ ํ์ฉํ์ฌ ๋ฐ์ดํฐ๊ฐ ์์์ ์์ง๋ง ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ ๊ณ ์ ํด์ผ ํ๋ค.
โ
- CUSTOMER ํ ์ด๋ธ ์ญ์ ํ ๋ค์ ์์ฑ
- ID๋ ํ์ ์ ๋ ฅ์ฌํญ์ด๋ฉด์ ๊ณ ์ ์ฑ์ ๊ฐ์ ธ์ผ ํด์ NOT NULL + UNIQUE ์ ์ฝ์ฌํญ ์ ์
- MOBILE(ํจ๋ํฐ)์ ํจ๋ํฐ์ด ์๋ ๊ณ ๊ฐ๋ ์์ง๋ง ํจ๋ํฐ์ด ์๋๊ฒฝ์ฐ ๊ณ ์ ํ ๋ฒํธ๋ฅผ ๊ฐ์ ธ์ผ ํ๊ธฐ ๋๋ฌธ์ UNIQUE ์ ์ฝ์ฌํญ ์ ์
DROP TABLE CUSTOMER;
CREATE TABLE CUSTOMER(
ID VARCHAR2(8) NOT NULL CONSTRAINT CUSTOMER_ID_UK UNIQUE,
PWD VARCHAR2(8) NOT NULL,
NAME VARCHAR2(20),
SEX CHAR(1) DEFAULT 'M' -- ๋ํดํธ
CONSTRAINT CUSTOMER_SEX_CK CHECK (SEX IN ('M','F')),
MOBILE VARCHAR2(14) UNIQUE,
AGE NUMBER(3) DEFAULT 18
);
โก ์์์ NULL โ DEFAULT ๊ฐ ์นํ
INSERT INTO CUSTOMER(ID,PWD,NAME,MOBILE, AGE) VALUES('xman','ok','kang', '011-3333',21);

- ์ฑ๋ณ ์ปฌ๋ผ์ ์์์ ์ผ๋ก NULL์ด ์ง์ ๋์ง๋ง DEFAULT์ ์ํด์ 'M' ๊ฐ์ด ์ ์ฅ๋๋ค.
โข
INSERT INTO CUSTOMER(ID,PWD,NAME, MOBILE,AGE) VALUES('XMAN','yes','kim','011-3334',33);
- ๋ฐ์ดํฐ๋ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ๊ธฐ ๋๋ฌธ์ xman ๊ณผ XMAN์ ๋ค๋ฅธ ๋ฐ์ดํฐ
โฃ
INSERT INTO CUSTOMER(ID,PWD,NAME, MOBILE,AGE) VALUES('xman','yes','lee', '011-3335',-21);

- ID์ค๋ณต์ผ๋ก Unique ์ ์ฝ ์ฌํญ ์๋ฐ ์๋ฌ ๋ฐ์ INSERT ์คํจ(ํ์๊ฐ์ ์คํจ)
โค
INSERT INTO CUSTOMER(ID,PWD,NAME, MOBILE,AGE) VALUES('yman','yes','lee', '011-3333',28);

- ํจ๋ํฐ ๋ฒํธ ์ค๋ณต์ผ๋ก Unique ์ ์ฝ ์ฌํญ ์๋ฐ ์๋ฌ ๋ฐ์ INSERT ์คํจ(ํ์๊ฐ์ ์คํจ)
โฅ
INSERT INTO CUSTOMER(ID,PWD,NAME, MOBILE) VALUES('๋ฌด๋ช
์ธ','yes',NULL, NULL);

- ID์ปฌ๋ผ์ NOT NULL ์ ์ฝ์ฌํญ์ผ๋ก NULL์ ํ์ฉํ์ง ์๋๋ค.
โค
ALTER TABLE CUSTOMER ADD CONSTRAINT CUSTOMER_NAME_SEX_UK UNIQUE(NAME,SEX); -- ์กฐํฉ์ ๊ณ ์ ๊ฐ
ALTER TABLE CUSTOMER MODIFY(NAME NOT NULL);
- ํ ์ด๋ธ ์์ฑํ ์ ์ฝ์ฌํญ ์ ๊ท ์ถ๊ฐ
- 2๊ฐ ์ปฌ๋ผ์ ์กฐํฉํ์ฌ Unique์ ์ฝ ์ฌํญ์ ์์ฑ
โฅ
INSERT INTO CUSTOMER(ID,PWD,NAME, SEX) VALUES('rman','yes','syo', 'M'); -- 1
INSERT INTO CUSTOMER(ID,PWD,NAME, SEX ) VALUES('Rman','yes','syo', 'F'); -- 2
INSERT INTO CUSTOMER(ID,PWD,NAME, SEX) VALUES('RmaN','yes','syo', 'M'); -- 3
SELECT * FROM CUSTOMER;
- ID ๋ฐ์ดํฐ ๋์๋ฌธ์ - ์๋ฏธ์ ์ผ๋ก ๊ฐ์ผ๋ฏ๋ก ๊ฐ์ ์๋ฏธ

- NAME+SEX ์กฐํฉ์ Unique ์ ์ฝ์ฌํญ โ ์ด๋ฆ์ด ๊ฐ์ง๋ง ๋ค๋ฅธ ๋ฐ์ดํฐ๋ก ์ฒ๋ฆฌ
โฆ INDEX ์์ฑ ์ฌ๋ถ ํ์ธ
SELECT INDEX_NAME,INDEX_TYPE,UNIQUENESS FROM USER_INDEXES
WHERE TABLE_NAME = 'CUSTOMER';
SELECT INDEX_NAME,COLUMN_POSITION,COLUMN_NAME FROM USER_IND_COLUMNS
WHERE TABLE_NAME = 'CUSTOMER' ORDER BY INDEX_NAME,COLUMN_POSITION;


[์ฐธ๊ณ ]
UNIQUE ์ ์ฝ์ฌํญ ์ ์์ ํด๋น ์ปฌ๋ผ์ INDEX ๊ฐ ์๋ ์์ฑ๋๋ค. INDEX๋ Data์ ๋ํ ๋น ๋ฅธ ์ ๊ทผ(Quick Search)๋ฅผ ํ ์ ์๋๋ก ํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค Object๋ก Unique ์ ์ฝ์ฌํญ ์ ์์ Index ์๋ ์์ฑ๋๋ ์ด์ ๋ ๋ฐ์ดํฐ ์ ๋ ฅ,์์ ์ ์ค๋ณต ์ฌ๋ถ๋ฅผ ๋น ๋ฅด๊ฒ ํ์ธ ํ๊ธฐ ์ํด์ ์์ฑ.
Primary Key
PRIMARY
๋ ์ฃผ์ํ, ๊ธฐ๋ณธ์ ์ธ ์ด๋ผ๋ ์ฌ์ ์ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ฉฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ PRIMARY KEY๋ ์ฃผํค ๋๋ ๊ธฐ๋ณธํค ๋ผ๊ณ ํ๋ค. ๊ธฐ๋ณธํค๋ ํ
์ด๋ธ๋ด์ ๊ฐ ๋ ์ฝ๋(ํ)์ ๊ณ ์ ํ๊ฒ ์๋ณํ๋ ๊ฐ์ ๊ฐ์ง ์ปฌ๋ผ(๋ค)์ ์กฐํฉ์ผ๋ก ์ปฌ๋ผ ๋ฐ์ดํฐ์ ๊ณ ์ ์ฑ(Uniqueness) ๊ณผ ์กด์ฌ์ฑ(Not Null)์ ๋์์ ๋ณด์ฅํ๋ ์ ์ฝ์ฌํญ.
Primary Key์ ๊ธฐ๋ณธ ํน์ง
์ต์์ฑ
๊ณ ์ ์ฑ
- Unique
์กด์ฌ์ฑ
- NOT NULL
๋ถ๋ณ์ฑ
- ๊ฐ์ด ๋ณํ์ง ์์์ผ ํ๋ค (๋ถ๋ชจ ํค๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์์ FK๊ฐ ๋ชจ๋ ๋ณํด์ผ ํ๋ฏ๋ก)
ํ ์ด๋ธ๋ด์ ๋ ์ฝ๋(ํ)์ ๊ณ ์ ํ๊ฒ ์๋ณ ํ ์ ์๋ ์๋ณ์ ํ๋ณด๊ฐ ์ฌ๋ฌ ๊ฐ ์๋ ๊ฒฝ์ฐ ๋ํ์ฑ์ ๊ฐ์ง ํ๋ณด๊ฐ PRIMARY KEY(๊ธฐ๋ณธํค)๊ฐ ๋๊ณ ๋๋จธ์ง ํ๋ณด์๋ค์ UNIQUE KEY๊ฐ ๋๋ค. ๊ธฐ๋ณธํค๋ ํ ์ด๋ธ์ 1๊ฐ๋ง ์ ์ํ ์ ์๊ณ UNIQUE KEY๋ ํ ์ด๋ธ์ N๊ฐ ์ ์ ๊ฐ๋ฅ.
โ
ID๋ ํ์ ์ ๋ ฅ์ฌํญ์ด๋ฉด์ ๊ณ ์ ์ฑ์ ๊ฐ์ ธ์ผ ํด์ PRIMARY KEY๋ก ์ ์ฝ์ฌํญ ์ ์ MOBILE(ํธ๋ํฐ)์ ํจ๋ํฐ์ด ์๋ ๊ณ ๊ฐ๋ ์์ง๋ง ํธ๋ํฐ์ด ์๋๊ฒฝ์ฐ ๊ณ ์ ํ ๋ฒํธ๋ฅผ ๊ฐ์ ธ์ผ ํ๊ธฐ ๋๋ฌธ์ UNIQUE KEY์ ์ฝ์ฌํญ ์ ์.
DROP TABLE CUSTOMER;
CREATE TABLE CUSTOMER(
ID VARCHAR2(8) CONSTRAINT CUSTOMER_ID_PK PRIMARY KEY, -- ์ ์ฝ ์ฌํญ ์ด๋ฆ ์ ์
PWD VARCHAR2(8) NOT NULL,
NAME VARCHAR2(20),
SEX CHAR(1) DEFAULT 'M'
CONSTRAINT CUSTOMER_SEX_CK CHECK (SEX IN ('M','F')),
MOBILE VARCHAR2(14) CONSTRAINT CUSTOMER_MOBILE_UK UNIQUE,
AGE NUMBER(3) DEFAULT 18
);
โก ์ฑ๋ณ(SEX),๋์ด(AGE) ์ปฌ๋ผ์ ์ ์๋ DEFAULT๋ ์ ๋ ฅ์ ์ปฌ๋ผ์ ๊ฐ์ด ์ง์ ๋์ง ์๋ ์์์ ์ธ NULL์ด ์ง์ ๋๋ฉด NULL ๋์ ์ ์ฅํ๋ ๊ฐ์ผ๋ก ์ฑ๋ณ์๋ 'M', ๋์ด๋ 18 ์ ๋ ฅ
INSERT INTO CUSTOMER(ID,PWD,NAME,MOBILE) VALUES('zman','ok','ํ๊ตญ', '011');

โข MOBILE ์ปฌ๋ผ์๋ UNIQUE KEY ์ ์ฝ์ฌํญ์ด ์ ์๋์์ง๋ง NULL ํ์ฉ.
INSERT INTO CUSTOMER(ID,PWD,NAME) VALUES('xman','ok','king');

โฃ ID์ค๋ณต์ผ๋ก ์๋ฌ๊ฐ ๋ฐ์ํ๋ค. SQL ์ค๋ฅ: ORA-00001: ๋ฌด๊ฒฐ์ฑ ์ ์ฝ ์กฐ๊ฑด(SCOTT.CUSTOMER_ID_PK)์ ์๋ฐฐ๋ฉ๋๋ค
- 00000 - "unique constraint (%s.%s) violated"
INSERT INTO CUSTOMER(ID,PWD,NAME) VALUES('xman','power','zzang');

โค ๋ฐ์ดํฐ๋ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ๋ค.
'xman
' ์ 'Xman
'์ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ก ์ค๋ณต ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
INSERT INTO CUSTOMER(ID,PWD,NAME) VALUES('Xman','korea','dbzzang');

โ ๋์๋ฌธ์ ์ค๋ณต ํด๊ฒฐ ๋ฐฉ๋ฒ?
โฅ VALUES์ ์ ํจ์ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค, ID ์ค๋ณต์ผ๋ก ๋ฌด๊ฒฐ์ฑ ์๋ฐ ์๋ฌ ๋ฐ์
INSERT INTO CUSTOMER(ID,PWD,NAME) VALUES(lower('xMan'),'ok','zzang');
โ ์ฌ์ฉ์ ์ ๋ ฅํ ๋ชจ๋ ๋ฐ์ดํฐ ํจ์ ์ฒ๋ฆฌ (DBMS level์์ ์ฟผ๋ฆฌ ์ด์ฉ ๋ฐ์ดํฐ ๋ณํ ์ฒ๋ฆฌ)

โฆ INSERT์ ์ปฌ๋ผ ์๋ต์ ํด๋น ์ปฌ๋ผ์ ์์์ NULL์ด ์ง์ ๋๋ค. PRIMARY KEY๋ NULL์ ํ์ฉํ์ง ์๋๋ค. SQL ์ค๋ฅ: ORA-01400: NULL์ ("SCOTT"."CUSTOMER"."ID") ์์ ์ฝ์ ํ ์ ์์ต๋๋ค.
INSERT INTO CUSTOMER(PWD,NAME) VALUES('ok','kim');

- ์กด์ฌ์ฑ ๋๋ฌธ์ ์๋ฌ๊ฐ ๋ฐ์
โง PRIMARY KEY์ ์ ์ผ์ฑ(UNIQUENESS) ๊ณผ ์กด์ฌ์ฑ(NOT NULL)์ ์๋ฐ ํ๋ ๊ฒฝ์ฐ UPDATE ๋ช ๋ น์ด ์ํ๋์ง ์๋๋ค.
UPDATE CUSTOMER SET ID = NULL; -- ์กด์ฌ์ฑ(NOT NULL)
UPDATE CUSTOMER SET ID = 'XMAN'; -- ์ ์ผ์ฑ(UNIQUENESS) / ๊ณ ์ ์ฑ ์๋ฐฐ

โจ
1) USER_CONSTRAINTS๋ ์ฌ์ฉ์ ์์ (Owner)์ ๋ชจ๋ ์ ์ฝ์ฌํญ(CONSTRAINT)๋ฅผ ์กฐํ ํ ์ ์๋ค.
SELECT * FROM USER_CONSTRAINTS;

2) USER_CONS_COLUMNS๋ ์ ์ฝ์ฌํญ์ ๊ด๋ จ๋ ์ปฌ๋ผ(COLUMN)์ ์ ๋ณด๋ฅผ ์กฐํํ ์ ์๋ค.
SELECT * FROM USER_CONS_COLUMNS;

3) USER_INDEXES๋ ์ฌ์ฉ์ ์์ (Owner)์ ๋ชจ๋ ์ธ๋ฑ์ค(INDEX)๋ฅผ ์กฐํ ํ ์ ์๋ค
SELECT * FROM USER_INDEXES;

4) USER_IND_COLUMNS๋ ์ธ๋ฑ์ค์ ๊ด๋ จ๋ ์ปฌ๋ผ(COLUMN)์ ์ ๋ณด๋ฅผ ์กฐํํ ์ ์๋ค.
SELECT * FROM USER_IND_COLUMNS;

๊ฐ๋ฐ์ด๋ ํ๋์ ๋น๋ฒํ๊ฒ ์ฌ์ฉํ๊ฒ๋จ์ผ๋ก ์ค์ต์ ํตํด ์ตํ๋์ด์ผ ํ๋ค.
Foreign Key

- ์ฐ๊ด์ฑ ์๋ ํ ์ด๋ธ๊ฐ(๋ด) ์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ(Referential Integrity) ๋ณด์ฅ.
- ์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ์ด๋ ํ ์ด๋ธ ์ฌ์ด์ ๊ด๊ณ์์ ๋ฐ์ํ๋ค. ์ด์ ์์ ๋ฅผ ๋ณด๋ฉด ๋ถ์ ํ ์ด๋ธ๊ณผ ์ฌ์ ํ ์ด๋ธ์ ๋ถ์๋ฒํธ๋ผ๋ ๊ณตํต์ ๋ฐ์ดํฐ ์์ฑ์ ๊ฐ์ง๊ณ ๊ด๊ณ ํ์ฑ.
- ๋ถ์๋ฒํธ ์์ฑ(P.K or U.K)์ ์๋ ๋ถ์ ๊ฐ์ฒด(ํ ์ด๋ธ)์์ ์ ์ ๋ํ ์ฌ์ ๊ฐ์ฒด(ํ ์ด๋ธ)์ ๊ด๊ณ๋ฅผ ํ์ฑํ๊ธฐ ์ํด ์ฌ์ ๊ฐ์ฒด(ํ ์ด๋ธ)์๊ฒ ์์๋(๋น์๋ณ๊ด๊ณ) ์์ฑ. *๊ฐ ํ ์ด๋ธ์ ์กด์ฌํ๋ ๊ณตํต๋ ๋ฐ์ดํฐ ์์ฑ๊ฐ์ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํ๋ ๊ฒ์ด ์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ ์ ์ฝ ์ฌํญ.
โ
CREATE TABLE ๋ถ์(๋ถ์๋ฒํธ VARCHAR2(2) CONSTRAINT ๋ถ์_๋ถ์๋ฒํธ_PK PRIMARY KEY,
๋ถ์๋ช
VARCHAR2(10) CONSTRAINT ๋ถ์_๋ถ์๋ช
_NN NOT NULL
);
CREATE TABLE ์ฌ์(์ฌ๋ฒ VARCHAR2(8) PRIMARY KEY,
์ด๋ฆ VARCHAR2(10),
๋ถ์๋ฒํธ VARCHAR2(2) , -- Table Level ์ ์ฝ์ฌํญ
CONSTRAINT ์ฌ์_๋ถ์_๋ถ์๋ฒํธ_FK FOREIGN KEY(๋ถ์๋ฒํธ)
REFERENCES ๋ถ์(๋ถ์๋ฒํธ) [ON DELETE CASCADE | SET NULL]
);
โก DESCRIBE ๋ถ์ // not null , ์ถ์ฝ
desc ์ฌ์
SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE,
TABLE_NAME,SEARCH_CONDITION,R_CONSTRAINT_NAME,DELETE_RULE,STATUS
FROM USER_CONSTRAINTS
WHERE TABLE_NAME IN ('๋ถ์','์ฌ์');
-- CONSTRAINT_NAME, CONSTRAINT_TYPE, R_CONSTRAINT_NAME,DELETE_RULE ๊ด์ฐฐ

โข ๋ถ์ ๋ฐ์ดํฐ๊ฐ ์กด์ฌ ํ์ง ์๋ ์ํฉ์์ ์ฌ์ ์ ๋ณด ์ ๋ ฅ์ ์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ ์๋ฌ ๋ฐ์
INSERT INTO ์ฌ์(์ฌ๋ฒ,์ด๋ฆ,๋ถ์๋ฒํธ) VALUES('XMAN', 'TUNER','10');
- SQL ์ค๋ฅ: ORA-02291: ๋ฌด๊ฒฐ์ฑ ์ ์ฝ์กฐ๊ฑด(SCOTT.์ฌ์_๋ถ์_๋ถ์๋ฒํธ_FK)์ด ์๋ฐฐ๋์์ต๋๋ค. ๋ถ๋ชจ ํค๊ฐ ์์ต๋๋ค
INSERT INTO ๋ถ์(๋ถ์๋ฒํธ,๋ถ์๋ช
) VALUES('10','๊ด๋ฆฌ'); -- ๋ถ์(Parent data) ์ ๋ณด ์
๋ ฅ
INSERT INTO ๋ถ์(๋ถ์๋ฒํธ,๋ถ์๋ช
) VALUES('20','์ ์ฐ');
INSERT INTO ๋ถ์(๋ถ์๋ฒํธ,๋ถ์๋ช
) VALUES('50','์์
');
โฃ 10๋ฒ,20๋ฒ ๋ถ์์ ๊ทผ๋ฌดํ๋ ์ฌ์ // ์ฌ์(Child data) ์ ๋ณด ์ ๋ ฅ
INSERT INTO ์ฌ์(์ฌ๋ฒ,์ด๋ฆ,๋ถ์๋ฒํธ) VALUES('XMAN','TUNER',10);
INSERT INTO ์ฌ์(์ฌ๋ฒ,์ด๋ฆ,๋ถ์๋ฒํธ) VALUES('YMAN','DBA',20);
โค 30๋ฒ ๋ถ์(์กด์ฌํ์ง ์๋ ๋ถ์)์ ๊ทผ๋ฌดํ๋ ์ฌ์ ์ ๋ ฅ์ ์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ ์๋ฌ ๋ฐ์
INSERT INTO ์ฌ์(์ฌ๋ฒ,์ด๋ฆ,๋ถ์๋ฒํธ) VALUES('ZMAN', 'DEVELOPER',30);
- SQL ์ค๋ฅ: ORA-02291: ๋ฌด๊ฒฐ์ฑ ์ ์ฝ์กฐ๊ฑด(SCOTT.์ฌ์_๋ถ์_๋ถ์๋ฒํธ_FK)์ด ์๋ฐฐ๋์์ต๋๋ค. ๋ถ๋ชจ ํค๊ฐ ์์ต๋๋ค
โฅ ๊ทผ๋ฌด์๊ฐ (Child data) ์๋ 50๋ฒ๋ถ์ ํ์ง
DELETE FROM ๋ถ์ WHERE ๋ถ์๋ฒํธ = 50;
โฆ ๊ทผ๋ฌด์๊ฐ ์๋ 10๋ฒ๋ถ์ ํ์ง์ ์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ์ผ๋ก ์๋ฌ ๋ฐ์.
-- on delete
โrestrict (default)
โ cascade(๋ถ๋ชจ ๋ฐ์ดํฐ ์ญ์ ์ ์์๋ ์ญ์ )
โ set null (์์ ๋ฐ์ดํฐ null ์ฒ๋ฆฌ)
DELETE FROM ๋ถ์ WHERE ๋ถ์๋ฒํธ = 10;
- SQL ์ค๋ฅ: ORA-02292: ๋ฌด๊ฒฐ์ฑ ์ ์ฝ์กฐ๊ฑด(SCOTT.์ฌ์_๋ถ์_๋ถ์๋ฒํธ_FK)์ด ์๋ฐฐ๋์์ต๋๋ค. ์์ ๋ ์ฝ๋๊ฐ ๋ฐ๊ฒฌ ๋์์ต๋๋ค SELECT * FROM ์ฌ์; // ๋ฐ์ดํฐ๊ด์ฐฐ
โง ๊ทผ๋ฌด์๊ฐ ์๋ 10๋ฒ๋ถ์ ํ์ง ๋ฐฉ๋ฒ์? โ on delete restrict โ ํด๋น ๋ถ์ ๊ทผ๋ฌด์๋ฅผ ํด์ฌ(DELETE)์ฒ๋ฆฌ ํ๊ฑฐ๋ ๋ค๋ฅธ ๋ถ์๋ก ์ด๊ด(UPDATE)ํ๊ณ ํ์งํ๋ค.
UPDATE ์ฌ์ SET ๋ถ์๋ฒํธ=20 WHERE ๋ถ์๋ฒํธ=10;
DELETE FROM ๋ถ์ WHERE ๋ถ์๋ฒํธ = 10;
โ on delete cascade DROP TABLE ์ฌ์; CREATE TABLE ์ฌ์ ~ on delete cascade ์์ฑํ โก ~ โฆ ์ฌ ์คํ , โข ์๋ต
โ set null DROP TABLE ์ฌ์; CREATE TABLE ์ฌ์ ~ on delete set null ์์ฑํ โก ~ โฆ ์ฌ ์คํ , โข ์๋ต
Uploaded by N2T