[๋ฐ์ดํฐ๋ฒ ์ด์ค] DB์์ FK ์ค์ ํ์ง ์๋ ์ด์ ์ ๋ฌด๊ฒฐ์ฑ ๊ด๋ฆฌํ๋ ๋ฐฉ์
FK ์ ์ฝ ์กฐ๊ฑด์ ์ค์ ํ๋ฉด
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ์ ์ ์งํ๊ธฐ ์ํด ๊ด๋ จ ํ
์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ํญ์ ํ์ธํด์ผ ํ๋ฏ๋ก
๋ฐ์ดํฐ ์ฝ์ (insert)์ด๋ ๊ฐฑ์ (update) ์ฑ๋ฅ์ด ์ ํ๋ ์ ์๋ค.
๋ฐ๋ผ์, ๋๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๊ฐ ์ผ์ด๋๋ ๊ฒฝ์ฐ FK๋ก ์ธํ ๋ฌด๊ฒฐ์ฑ ๊ฒ์ฌ ๋๋ฌธ์ ์ฒ๋ฆฌ ์๋๊ฐ ๋๋ ค์ง ์ ์๋ค.
FK๊ฐ ๋ง์ ํ ์ด๋ธ ๊ตฌ์กฐ๋ ์ค๊ณ๊ฐ ๋ณต์กํด์ง๊ณ , ์ด๋ฅผ ์์ ํ๊ฑฐ๋ ํ์ฅํ ๋ ์ด๋ ค์์ด ์๊ธธ ์ ์๋ค.
์๋ฅผ ๋ค์ด, ์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ์ ์ ์งํ๋ ค๋ฉด ๋ถ๋ชจ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๊ธฐ ์ ์ ์์ ๋ฐ์ดํฐ๋ฅผ ๋จผ์ ์ญ์ ํด์ผ ํ๋ค.
ํ ์ด๋ธ ๊ตฌ์กฐ๊ฐ ์์ฃผ ๋ณ๊ฒฝ๋๊ฑฐ๋ ํ์ฅ์ด ํ์ํ ๊ฒฝ์ฐ, FK๋ ๋ถํ์ํ ์ ์ฝ์ด ๋ ์ ์๋ค.
FK๋ก ์ธํด ํ ์ด๋ธ ๊ฐ ์์กด์ฑ์ด ๊ฐํด์ง๋ฉฐ, ํ ์ด๋ธ ๊ฐ์ ๊ฒฐํฉ๋ ์ฆ๊ฐ๋ก ์ธํด ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ์ด๋ ค์์ง ์ ์๋ค.
1. ์ ํ๋ฆฌ์ผ์ด์ ๋ ๋ฒจ์์ ๋ฐ์ดํฐ ์ฝ์ /๊ฐฑ์ /์ญ์ ์ ์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ์ ํ์ธํ๋ ๋ก์ง์ ์์ฑํ๋ค.
์๋ฅผ ๋ค์ด, ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ๊ธฐ ์ ์ ๋ถ๋ชจ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋์ง ํ์ธํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
2. ๋ฐ์ดํฐ๋ฒ ์ด์ค ํธ๋ฆฌ๊ฑฐ๋ฅผ ์ค์ ํ์ฌ ์ฐธ์กฐ ๋ฐ์ดํฐ์ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํ๋ค.
๋ถ๋ชจ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๊ฐ ์ญ์ ๋๊ธฐ ์ ์ ๊ด๋ จ ์์ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๊ฐ ์๋์ง ํ์ธํ๋ ํธ๋ฆฌ๊ฑฐ๋ฅผ ์์ฑํ๋ค.
CREATE OR REPLACE TRIGGER check_parent_exists
BEFORE INSERT ON child_table
FOR EACH ROW
BEGIN
IF NOT EXISTS (
SELECT 1
FROM parent_table
WHERE id = :NEW.parent_id
) THEN
RAISE_APPLICATION_ERROR(-20001, 'Parent does not exist.');
END IF;
END;
3. ๋ฐฐ์น ์์ ์ ํตํ ๋ฌด๊ฒฐ์ฑ ์ ์ง
SELECT child_table.id
FROM child_table
LEFT JOIN parent_table
ON child_table.parent_id = parent_table.id
WHERE parent_table.id IS NULL;
4. ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ORM ์ฌ์ฉ
@Entity
public class Child {
@ManyToOne
@JoinColumn(name = "parent_id", nullable = false)
private Parent parent;
}
5. ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ํคํ ์ฒ : ๋ง์ดํฌ๋ก์๋น์ค๋ ๋ถ์ฐ ์์คํ ํ๊ฒฝ
6. ์ ์ฝ ์กฐ๊ฑด์ ์ฌ์ฉํ์ง ์๋ ํ ์ด๋ธ ์ค๊ณ
๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ์์์ ์ผ๋ก ์ค๊ณ >>
๋ถ๋ชจ/์์ ํ
์ด๋ธ์์ ์ ์ฝ ์กฐ๊ฑด ์์ด ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋, ๋ฐ์ดํฐ ๋ชจ๋ธ ์ค๊ณ๋ฅผ ํตํด ๋ฌด๊ฒฐ์ฑ์ ์์์ ์ผ๋ก ์ ์งํ๋ค.
| SQL ์ํํธ ํ์ฑ vs ํ๋ ํ์ฑ (0) | 2024.05.05 |
|---|---|
| [Oracle DB] ON DELETE CASCADE / SET NULL / ์ฐธ์กฐ๋๋ ๋ถ๋ชจ ํ ์ด๋ธ ๋ฐ์ดํฐ ์ญ์ (0) | 2024.04.17 |
| [Oracle DB] ๋ฐ์ดํฐ ํ์ : CHAR, VARCHAR, VARCHAR2, NUMBER (0) | 2024.04.16 |
| [ORACLE] MySQL์๋ AUTO_INCREMENT๊ฐ ์์ง๋ง.. (0) | 2024.03.16 |
| [๋ฐ์ดํฐ๋ฒ ์ด์ค-๊ฐ๋ ] NoSQL ์ข ๋ฅ์ ๊ฐ ํน์ง (0) | 2023.04.14 |