๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด ์ ์ฅํ๊ณ , ์์ผ๋ฉด ์ ๋ฐ์ดํธ ํด๋ผ!
MERGE INTO ํ
์ด๋ธ๋ช
(์ต์ข
์ ์ฅํ ๋์) --์ ์ฒด ์ง์
USING ๊ฐ์ ธ์ฌ๋ฐ์ดํฐํ
์ด๋ธ๋ช
--๊ณ์ด์ฌ ์ง์
ON ( ํฉ์น๋ ์กฐ๊ฑด )
WHEN MATCHED THEN --๋ถํฉํ๋๊ฒ ์๋ค -> ์์
UPDATE SET ์ปฌ๋ผ๋ช
= ๊ฐ
WHERE
WHEN NOT MATCHED THEN --๋ถํฉํ๋๊ฒ ์๋ค -> ์ฝ์
INSERT VALUES ( ์ปฌ๋ผ๋ช
);
emp_b1 (๊ณ์ด์ฌ1)
emp_b2 (๊ณ์ด์ฌ2)
emp_all (์ต์ข
์ง๊ณ ์ ์ฒด ์ง์ ๋ชฉ๋ก)
๐ ํ ์ด๋ธ ์์ฑ - CREATE
CREATE TABLE emp_b1
(
empno NUMBER(3),
name VARCHAR2(16),
pay NUMBER(10)
);
CREATE TABLE emp_b2
(
empno NUMBER(3),
name VARCHAR2(16),
pay NUMBER(10)
);
CREATE TABLE emp_all
(
empno NUMBER(3),
name VARCHAR2(16),
type NUMBER(1), --1 ๊ณ์ด์ฌ, 2 ๊ณ์ด์ฌ
pay NUMBER(10)
);
๐ ํ ์ด๋ธ ์ฝ์ - INSERT
--emp_b1
INSERT INTO emp_b1 VALUES (1, '1์ด๋ฆ', 100);
INSERT INTO emp_b1 VALUES (2, '2์ด๋ฆ', 200);
INSERT INTO emp_b1 VALUES (3, '3์ด๋ฆ', 400);
--emp_b2
INSERT INTO emp_b2 VALUES (4, '4์ด๋ฆ', 400);
INSERT INTO emp_b2 VALUES (5, '5์ด๋ฆ', 500);
INSERT INTO emp_b2 VALUES (6, '6์ด๋ฆ', 1000);
๐ emb_b1 ๊ณผ emp_b2๋ฅผ emp_all์ ๋ณํฉํ๊ธฐ!
--emp_b1 ๋ณํฉ
MERGE INTO emp_all ea --์ ์ฒด ์ง์
USING emp_b1 e1 --๊ณ์ด์ฌ ์ง์
ON ( ea.empno = e1.empno ) --ํฉ์น๋ ์กฐ๊ฑด
WHEN MATCHED THEN --๋ถํฉํ๋๊ฒ ์๋ค -> ์์
UPDATE SET ea.pay = e1.pay
--WHERE
WHEN NOT MATCHED THEN --๋ถํฉํ๋๊ฒ ์๋ค -> ์ฝ์
INSERT VALUES ( e1.empno, e1.name, 1, e1.pay );
--emp_b2 ๋ณํฉ
MERGE INTO emp_all ea --์ ์ฒด ์ง์
USING emp_b2 e2 --๊ณ์ด์ฌ ์ง์
ON ( ea.empno = e2.empno ) --ํฉ์น๋ ์กฐ๊ฑด
WHEN MATCHED THEN --๋ถํฉํ๋๊ฒ ์๋ค -> ์์
UPDATE SET ea.pay = e2.pay
--WHERE
WHEN NOT MATCHED THEN --๋ถํฉํ๋๊ฒ ์๋ค -> ์ฝ์
INSERT VALUES ( e2.empno, e2.name, 2, e2.pay );
๐ป
NOT NULL : ๋ ์๋จ. ๊ฐ์ด ๋ฌด์กฐ๊ฑด ์กด์ฌ / NULL X
UNIQUE : ์ ์ผํด์ผํ๋ค. ์ค๋ณต๊ฐ ์ ์ฅ XXXX / ์ค๋ณต X
CHECT : ํด๋น ์กฐ๊ฑด์ ๋ง๋ ๊ฐ๋ง ํ์ฉ ex) ์ ์ NUMBER(3) 999 0~100
PRIMARY KEY : PK ๊ธฐ๋ณธํค์ค์ ! (NOT NULL + UNIQUE), ํ
์ด๋ธ์ 1๊ฐ๋ง ์ค์ !
FOREIGN KEY : FK ์ธ๋ํค์ค์ ! ๋ค๋ฅธ ํ
์ด๋ธ ์ปฌ๋ผ์ ์ฐธ์กฐ
CREATE TABLE test001
(
no NUMBER(3) UNIQUE,
id VARCHAR2(30) NOT NULL,
name VARCHAR2(30) NOT NULL
);
--๋ฐ์ดํฐ ์ฝ์
INSERT INTO test001
VALUES (1, 'myid1', null); --์์ฑํ ๋ name NOT NULL! -> null ์ ์ฅ๋ถ๊ฐ
INSERT INTO test001
VALUES (1, 'myid1', 'name111');
INSERT INTO test001
VALUES (1, 'myid1', 'name111'); --no 1 ์ด unique ๊ทผ๋ฐ ์์ ์ด๋ฏธ ๋ง๋ค์ด์ง ์ํ์์ 1์ ๋ ๋ฃ์ผ๋ ค๊ณ ํ๋ฉด -> ๊ณ ์ ๋ฌด๊ฒฐ์ฑ ์ ์ฝ์กฐ๊ฑด ์๋ฐฐ
INSERT INTO test001
VALUES (2, 'myid1', 'name111');
INSERT INTO test001
VALUES (null, 'myid1', 'name111');
==> name์ NOT NULL ๋ก ์์ฑํ๊ธฐ ๋๋ฌธ์ null๋ก ์ ์ฅX
==> no๋ UNIQUE ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ 1์ด ์ด๋ฏธ ์ฝ์
๋์ด์๋ค๋ฉด ๋ค์์ 1์ ๋ค์ ์ฝ์
ํ๋ฉด ์ค๋ฅ!
๐ป
CREATE TABLE test002
(
no NUMBER(3) PRIMARY KEY, --ํ
์ด๋ธ์๋ ํ๋์ ๊ธฐ๋ณธํค๋ง!
id VARCHAR2(30) UNIQUE NOT NULL,
name VARCHAR2(30) NOT NULL --๋๋ช
์ด์ธ์ด ์์์๋ ์์ผ๋๊น ๊ธฐ๋ณธํคX
);
INSERT INTO test002
VALUES (1, 'myid1', null); --์์ฑํ ๋ name NOT NULL! -> null ์ ์ฅ๋ถ๊ฐ
INSERT INTO test002
VALUES (1, 'myid1', 'name111'); --๊ธฐ๋ณธํค ์ค๋ณตX
INSERT INTO test002
VALUES (null, 'myid1', 'name111'); --๊ธฐ๋ณธํค NULLX, id ์ค๋ณตX
INSERT INTO test002
VALUES (3, 'myid222', 'name111');
==> name์ NOT NULL ๋ก ์์ฑํ๊ธฐ ๋๋ฌธ์ null๋ก ์ ์ฅX
==> no๋ ๊ธฐ๋ณธํค! ๊ทธ๋์ ์ค๋ณตx
==> no๋ ๊ธฐ๋ณธํค! ๊ทธ๋์ nullx , id๋ UNIQUE๋ผ ์ค๋ณตX
CREATE TABLE test003
(
no NUMBER(3) CONSTRAINT test003_no_pk PRIMARY KEY, --SYS_C007501 ์ด๋ฐ์์ผ๋ก ๋จ๋๊ฒ ์๋๋ผ test003_no_pk ์ด๋ ๊ฒ ๋ธ
id VARCHAR2(30)
CONSTRAINT test003_id_uk UNIQUE
CONSTRAINT test003_id_nn NOT NULL,
name VARCHAR2(30)
CONSTRAINT test003_name_nn NOT NULL,
score NUMBER(3) -- 0~100
CONSTRAINT test003_score_ck CHECK (score BETWEEN 0 AND 100)
);
SELECT * FROM test003;
INSERT INTO test003
VALUES (1, 'id1', 'name1', 50); --๋๋ฒ ๋ฃ์์๋ ์์ด ๊ธฐ๋ณธํค๋ ์ค๋ณตX
INSERT INTO test003
VALUES (2, 'id2', 'name1', 50);
INSERT INTO test003
VALUES (3, 'id3', 'name1', 100);
==> CONSTRAINT test003_no_pk : ์๋ก ์ง์ ์ํด์ฃผ๋ฉด CONSTRAINT name์ SYS_C007501 ์ด๋ฐ์์ผ๋ก ์ ์ฅ๋๋๊ฒ ์๋๋ผ test003_no_pk๋ก ์ ์ฅ๋๋ค!
==> ๊ทธ๋ฆฌ๊ณ CHECK ๋ก score์ ๋ค์ด์ค๋ ๊ฐ์ ๋ฒ์ ์ง์ !
CREATE TABLE test004
(
no NUMBER(3) PRIMARY KEY, --ํ
์ด๋ธ์๋ ํ๋์ ๊ธฐ๋ณธํค๋ง! --no๋ PK
id VARCHAR2(30) PRIMARY KEY, --id๋ PK
name VARCHAR2(30) NOT NULL --๋๋ช
์ด์ธ์ด ์์์๋ ์์ผ๋๊น ๊ธฐ๋ณธํคX
);
--๋๊ฐ ์กฐํฉ PK VS ํ
์ด๋ธ์๋ ํ๊ฐ์ PK๋ง ์ค์ ๊ฐ๋ฅ!
--no + id ๊ฒฐํฉํด์ PK ์ค์ ํ๊ณ ์ถ์ผ๋ฉด?
CREATE TABLE test004
(
no NUMBER(3), --no๋ PK
id VARCHAR2(30), --id๋ PK
name VARCHAR2(30) NOT NULL, --๋๋ช
์ด์ธ์ด ์์์๋ ์์ผ๋๊น ๊ธฐ๋ณธํคX
--no + id ๊ฒฐํฉํด์ PK ์ค์
CONSTRAINT test004_pk PRIMARY KEY (no, id)
);
==> ํ
์ด๋ธ์๋ ํ๋์ ๊ธฐ๋ณธํค๋ง ์ง์ ํ ์ ์๋ค!
==> ๊ทผ๋ฐ ์ฌ๋ฌ ์ปฌ๋ผ์ ๊ฒฐํฉํด์ ๊ธฐ๋ณธํค๋ก ์ง์ ํ๊ณ ์ถ๋ค๋ฉด?
CONSTRAINT test004_pk PRIMARY KEY (no, id) ์ด๋ฐ์์ผ๋ก ๋ฐ์์ ๋ฐ๋ก ์ด๋ฆ test004_pk ์ค์ ํด์ฃผ๊ณ no, id ๋๊ฐ๋ฅผ ๋์์ ๊ธฐ๋ณธํค๋ก ์ง์ ํด์ค๋ค~!
--mystu myprof
CREATE TABLE mystu
(
stuno NUMBER(4) PRIMARY KEY,
name VARCHAR2(30) NOT NULL,
profno NUMBER(4) CONSTRAINT mystu_fk REFERENCES myprof(profno)
-- profno NUMBER(4) CONSTRAINT mystu_fk REFERENCES myprof(profno) ON DELETE CASCADE; -> ์ฐธ์กฐ๊ฐ์ด ์ง์์ง๋ ๊ฐ์ด ์ง์์ง๋ => ์ฐ์์ญ์
-- profno NUMBER(4) CONSTRAINT mystu_fk REFERENCES myprof(profno) ON DELETE SET NULL; -> ์ฐธ์กฐ๊ฐ์ด ์ง์์ง๋ NULL๋ก ์ธํ
=> NULL๋ก ๋ฐ๋
);
CREATE TABLE myprof
(
profno NUMBER(4) PRIMARY KEY,
name VARCHAR2(30) NOT NULL
);
INSERT INTO myprof VALUES (1, '๊ต์1');
INSERT INTO myprof VALUES (2, '๊ต์2');
INSERT INTO myprof VALUES (3, '๊ต์3');
SELECT * FROM myprof;
COMMIT;
INSERT INTO mystu VALUES (101, 'ํ์1', null);
INSERT INTO mystu VALUES (102, 'ํ์2', 1);
INSERT INTO mystu VALUES (103, 'ํ์3', 3);
INSERT INTO mystu VALUES (104, 'ํ์4', 8); --myprof prof 1,2,3๋ง! ์ธ๋ํค ์ค์ ํ ์ปฌ๋ผ์ ์กด์ฌํ๋ ๊ฐ๋ง ์ถ๊ฐ ๊ฐ๋ฅ!
INSERT INTO mystu VALUES (104, 'ํ์4', 2); --myprof prof์ 1,2,3์์ผ๋๊น 1,2,3๋ง ๋ค์ด๊ฐ์์์ด!
SELECT * FROM mystu;
COMMIT;
SELECT *
FROM mystu s, myprof p
WHERE s.profno = p.profno(+); --stu์ ์๋๊ฒ ๋ค๋์ค๋ ์์ฐํฐ์กฐ์ธ
--3๊ต์๊ฐ ํด์ฌ -> 3๊ต์ ๋ฐ์ดํฐ๋ฅผ ์ญ์
DELETE FROM myprof
WHERE profno = 3; --์ธ๋ถ์์ ์ฐธ์กฐํ๊ณ ์๋ ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด, ์ญ์ ๋ถ๊ฐ! -> ์ง์ฐ๋ ์๊ฐ mystu prof 3์ด ์กฐ๊ฑด ์๋ฐฐ!
--๊ทธ๋์ mystu prof 3์ ์์ ์์ ์ผ myprof prof 3์ ์ง์ธ ์ ์์
--๊ทผ๋ฐ ์์ฑํ ๋ CASCADE ๊ฑธ์ด๋๋ฉด myprof์์ ์ง์ฐ๋ฉด mystu์์๋ ์น ์ง์์ง!
DELETE FROM mystu
WHERE profno = 3; --๊ทธ๋์ mystu prof 3์ ์์ ์์ ์ผ myprof prof 3์ ์ง์ธ ์ ์์
==> myprof ํ
์ด๋ธ์ profno๋ฅผ ์ธ๋ํค๋ก ์ฌ์ฉํ๊ณ ์ถ์ผ๋ฉด profno NUMBER(4) CONSTRAINT mystu_fk REFERENCES myprof(profno) ๋ก ์ฐธ์กฐํ๋ ์ธ๋ํค๋ก ์ง์ !
=> ๊ทผ๋ฐ ์กฐ๊ฑด์ ๋ ๊ฑธ์ ์๋ค! ON DELETE CASCADE;๋ ์ฐธ์กฐ๊ฐ์ ์ง์ธ๋ ๊ฐ์ด ์ง์์ง๋ ์ฐ์์ญ์ ํจ๊ณผ, ON DELETE SET NULL;๋ ์ฐธ์กฐ๊ฐ์ด ์ง์์ง๋ mystu๋ null๋ก ๋ฐ๋๋ ํจ๊ณผ
==> INSERT INTO mystu VALUES (104, 'ํ์4', 8); ๋ฅผ ํ ์์๋ค! myprof prof์๋ 1,2,3๋ง ์กด์ฌ! ์ธ๋ํค ์ค์ ํ ์ปฌ๋ผ์ ์กด์ฌํ๋ ๊ฐ๋ง ์ถ๊ฐ ๊ฐ๋ฅ!
==> myprof์์ prof 3์ ์ญ์ ํ๊ณ ์ถ๋ค๋ฉด ์ธ๋ถ์์ ์ฐธ์กฐํ๊ณ ์๋ ๋ฐ์ดํฐ๊ฐ ์์ด์ผ ์ญ์ ๊ฐ ๊ฐ๋ฅํ๋ค!
=> ๊ทธ๋์ mystu์์ prof 3์ ์์ ๋ค์์ ์ผ myprof์์ prof 3์ ์ญ์ ๊ฐ๋ฅ
๐จ ๊ทผ๋ฐ !!!!! ์์ฑํ๋ ๊ณผ์ ์์ CASCADE๋ฅผ ๊ฑธ์ด๋จ๋ค๋ฉด myprof์์ ์ง์๋ mystu์์๋ ์น ์ง์์ง!