
์ ์ฝ์กฐ๊ฑด ?
์ ์ฝ์กฐ๊ฑด์ ๊ฐ ์ปฌ๋ผ๋ค๊ฐ์ ์ ํ์ฌํญ์ ๊ด๋ฆฌํ๊ณ , ์กฐ๊ฑด์ ์๋ฐํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐฉ์งํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์ ์ฑ์ ๋ณด์ฅํ๋ ๊ท์น์ ๋๋ค.
์ ์ฝ ์กฐ๊ฑด์ ์ข ๋ฅ
- ๊ณ ์ (Unique) ์ ์ฝ ์กฐ๊ฑด
- NULL ์ ์ฝ ์กฐ๊ฑด
- ๊ธฐ๋ณธ ํค(primary Key) ์ ์ฝ์กฐ๊ฑด - ํ ์ด๋ธ ๊ตฌ์ฑ์ ๊ณ ์ ์ฑ์ ๋ณด์ฅํ๋ ์กฐ๊ฑด
- ์ธ๋ ํค(Foreign Key) ์ ์ฝ์กฐ๊ฑด - ํ ์ด๋ธ๊ฐ์ ๊ด๊ณ๋ฅผ ์ค์ ํ๋ ์กฐ๊ฑด
๊ธฐ๋ณธ ํค ์ ์ฝ์กฐ๊ฑด, ์ค๋ฅ๋ฐ์
ํ ์ด๋ธ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ๊ณ ์ ํ๊ฒ ๊ตฌ๋ถํ ์ ์๋ ์ ๋ณด๋ฅผ ๋ํ๋ด๊ธฐ ์ํด์ ์ฌ์ฉํ๋ค.
๊ธฐ๋ณธํค๋ฅผ ์ค์ ํ์ง ์์ ํ ์ด๋ธ์ ์์ฑํ๊ณ ์ ํ๋ค๋ฉด, ํน์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๊ธฐ์ํ ๊ณ ์ ํ ์ ๋ณด๊ฐ ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ ์๋์ ๊ฐ์ error๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋๋ฉด์ ํ ์ด๋ธ ์์ฑ์ด ๋์ง ์๋๋ค.
ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key
ํ ์ด๋ธ์ ์์ฑํ๊ณ ์ ํ๋ค๋ฉด, ๊ธฐ๋ณธํค๋ฅผ ์ ์ฝ์กฐ๊ฑด์ผ๋ก ๊ผญ ๋ฑ๋กํด์ฃผ์ !
CREATE TABLE User
(
userId int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
name varchar(255)
);
// ๋๋ PRIMARY KEY๋ฅผ name ์นผ๋ผ์ค์ ๋ค์ ์ค์ ๋ด๋ ค์ PRIMARY KEY(userId)๋ก ๊ธฐ๋ณธํค๋ฅผ ์ค์ ํด๋ ๋๊ฐ๋ค.
AUTO_INCREMENT ?
๋ฐ์ดํฐ๋ฅผ ์ฝ์
ํ ๋ ์๋ฌด๋ฐ ๋ฐ์ดํฐ๋ฅผ ์
๋ ฅํ์ง ์์๋, ๊ณ ์ ํ ๊ฐ์ ์ ์ง ํ ์ ์๋๋ก ๋์์ฃผ๋ ์์ฑ์ด๋ค.
DB๋ด์์ ์ซ์๋ฅผ 1์ฉ ์ฆ๊ฐ์์ผ ๊ธฐ๋ณธํค์ ๊ณ ์ ํ ๊ฐ์ ์ ์ง์์ผ์ฃผ๋ ์์ฑ์ด๊ธฐ ๋๋ฌธ์ ํจ์จ์ ์ธ ๊ฐ๋ฐ์ด ๊ฐ๋ฅํ๋ค.
NULL ์ ์ฝ ์กฐ๊ฑด
ํน์ ์ปฌ๋ผ์์ NULL ๊ฐ์ ํ์ฉํ๊ฑฐ๋, ํ์ฉํ์ง ์๋๋ก ์ค์ ํ๋ ์กฐ๊ฑด์ด๋ค.
CREATE TABLE User
(
userId int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
name varchar(255) NOT NULL
);
๊ณ ์ (Unique) ์ ์ฝ ์กฐ๊ฑด
ํน์ ์ปฌ๋ผ์์ ์ค๋ณต๋ ๊ฐ์ด ์กด์ฌํ์ง ์๋๋ก ์ค์ ํด์ฃผ๋ ์กฐ๊ฑด์ด๋ค.
CREATE TABLE User
(
userId int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
name varchar(255) NOT NULL UNIQUE
);
์์ ์ฝ๋ ์ฒ๋ผ name์ด๋ผ๋ ์ปฌ๋ผ์ ์์ฑ๊ฐ์ ์ ๋ํฌ๋ก ์ ํ์ ๊ฑธ์์ ๊ฒฝ์ฐ,
์ค๋ณต๋ ๊ฐ์ด ์ฝ์ ๋๋ฉด ๋์ค๋ ์ค๋ฅ ํ์ธํ๊ธฐ.
INSERT INTO User (name) VALUES ('์ด์ฉ์ฐ');
INSERT INTO User (name) VALUES ('์ด์ฉ์ฐ');
Error: ER_DUP_ENTRY: Duplicate entry '์ด์ฉ์ฐ' for key 'User.name'
์ถ๊ฐ๋ก ๊ธฐ๋ณธํค๋ฅผ ์ค์ ํ ์ปฌ๋ผ์, ๊ณ ์ ์ ์ฝ ์กฐ๊ฑด์ด ์๋์ผ๋ก ์ ์ฉ๋์ด ์๋ค.
์ธ๋ ํค(Foreign Key) ์ ์ฝ ์กฐ๊ฑด
ํ
์ด๋ธ๊ณผ ๋ค๋ฅธ ํ
์ด๋ธ๊ฐ์ ๊ด๊ณ๋ฅผ ๋งบ์ ๋ ์ฌ์ฉํ๋ ์ ์ฝ ์กฐ๊ฑด์ด๋ค.
์ธ๋ํค๋ ๊ฐ ํ
์ด๋ธ๊ฐ์ ์ฐ๊ด๊ด๊ณ๋ฅผ ํํํ ๋ ์ฌ์ฉํ ์ ์๋ค.
<์ฐ๊ด๊ด๊ณ>
- 1:1 = 1๋ช ์ ์ฌ์ฉ์๋ 1๊ฐ์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๊ฐ์ง์์๋ค.
- 1:N = 1๋ช ์ ์ฌ์ฉ์๋ ์ฌ๋ฌ๊ฐ์ ์ฃผ๋ฌธ์ ํ ์ ์๋ค.
- N:N = ํ ๋ช ์ ํ์์ ์ฌ๋ฌ๊ฐ์ ํ์์ ๋ค๋ ์ ์๊ณ , ํ๊ฐ์ ํ์์ ์ฌ๋ฌ๋ช ์ ํ์์ ๋ฐ์ ์ ์๋ค.
์๋ก์ ๊ด๊ณ๊ฐ ์ผ ๋ ๋ค์๋ผ๋ฉด N:N ๊ด๊ณ๊ฐ ํ์ฑ๋๋ค๊ณ ๋ณผ ์ ์๋ค.
CREATE TABLE ํ
์ด๋ธ๋ช
FOREIGN KEY (์ปฌ๋ผ๋ช
) REFERENCES ์ฐธ์กฐ_ํ
์ด๋ธ๋ช
(์ฐธ์กฐ_์ปฌ๋ผ๋ช
)
ON DELETE [์ฐ๊ณ ์ฐธ์กฐ ์ ์ฝ ์กฐ๊ฑด] // ์ฐธ์กฐ ์ปฌ๋ผ์ด ์ญ์ ๊ฐ ๋๋ค๋ฉด, ํฌ๋งํค์ ์ปฌ๋ผ์ ์ด๋ป๊ฒ ํ ๊ฒ์ธ๊ฐ.
ON UPDATE [์ฐ๊ณ ์ฐธ์กฐ ์ ์ฝ ์กฐ๊ฑด] // ์ฐธ์กฐ ์ปฌ๋ผ์ด ์์ ์ด ๋๋ค๋ฉด, ํฌ๋งํค์ ์ปฌ๋ผ์ ์ด๋ป๊ฒ ํ ๊ฒ์ธ๊ฐ.
);
์ธ๋ ํค ์ ์ฝ ์กฐ๊ฑด์ CREATE TABLE ์ ํตํด์ ํ
์ด๋ธ์ ์์ฑํ ๋ ์ ์๋ฅผ ํ ์ ์๋ค.
์์ ์ ๋์ค์ ALTER TABLE ๋ฌธ์ ์ฌ์ฉํด์ ๊ฐ๋ฅํ๋ค.
์์)
CREATE TABLE Garden
(
gardenId int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
address varchar(255) NOT NULL
);
CREATE TABLE GardenPlants
(
gardenPlantsId int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
GardenId int(11) NOT NULL,
name varchar(255) NOT NULL,
FOREIGN KEY (GardenId) REFERENCES Garden (gardenId)
);
// ์ธ๋ํค ์ค์ : GardenId
// ์ฐธ์กฐ ํ
์ด๋ธ : Garden
// ์ฐธ์กฐ ์ปฌ๋ผ๋ช
: gardenId
์ธ๋ ํค ์ ์ฝ ์กฐ๊ฑด, ์์ ๋ฐ ์ญ์
๋ค๋ฅธ ํ ์ด๋ธ์ ์ฐธ์กฐ ๋ฐ์ดํฐ๊ฐ ์ญ์ ๋ฐ ์์ ๋ ๋ ์ด๋ค ํ์๋ฅผ ํด์ผํ๋์ง ์ค์ ํ ์ ์๋ค.
- CASCADE
์ฐธ์กฐํ๊ณ ์๋ ๊ฐ์ฒด๊ฐ ๋ณ๊ฒฝ/์ญ์ ๋ ๊ฒฝ์ฐ ํจ๊ป ๋ณ๊ฒฝ/์ญ์ .
FOREIGN KEY (UserId) REFERENCES Users(userId)
ON DELETE CASCADE
ON UPDATE CASCADE;
- NO ACTION
์ฐธ์กฐํ๊ณ ์๋ ๊ฐ์ฒด๊ฐ ๋ณ๊ฒฝ/์ญ์ ๋ ๊ฒฝ์ฐ ์๋ฌด๋ฐ ํ์๋ฅผ ํ์ง ์๊ณ ์๋ฌ๋ฅผ ๋ฐ์
FOREIGN KEY (UserId) REFERENCES Users(userId)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
- SET NULL
์ฐธ์กฐํ๊ณ ์๋ ๊ฐ์ฒด๊ฐ ๋ณ๊ฒฝ/์ญ์ ๋ ๊ฒฝ์ฐ ํ์ฌ ๋ฐ์ดํฐ๋ฅผ NULL๋ก ๋ณ๊ฒฝํ๋ค.
FOREIGN KEY (UserId) REFERENCES Users(userId)
ON DELETE SET NULL
ON UPDATE SET NULL;
- SET DEFAULT
์ฐธ์กฐํ๊ณ ์๋ ๊ฐ์ฒด๊ฐ ๋ณ๊ฒฝ/์ญ์ ๋ ๊ฒฝ์ฐ ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ณธ ๊ฐ์ผ๋ก ๋ณ๊ฒฝํ๋ค.
FOREIGN KEY (UserId) REFERENCES Users(userId)
ON DELETE SET DEFAULT
ON UPDATE SET DEFAULT;
DESC๋ก ํ์ฌ ์ฐธ๊ณ ํ๊ณ ์๋ ๋ฐ์ดํฐ์ ๊ธฐ๋ณธ๊ฐ์ด ๋ฌด์์ธ์ง ํ์ธ์ด ๊ฐ๋ฅํ๋ค.
#SQL #์ ์ฝ์กฐ๊ฑด
#PRIMARYKEY
#FOREIGNKEY
'DB' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Sequelize] : migration ๊ณผ model / ๊ธฐ๋ณธ์ ์ธ ์ฌ์ฉ์์ (1) | 2023.07.13 |
---|---|
[sequelize] : sequelize ๊ธฐ๋ณธ์ธํ (0) | 2023.07.13 |
[SQL] : ์ฟผ๋ฆฌ๋ฌธ์ผ๋ก ๋ฐ์ดํฐ ์์ฑํ๊ณ ์กฐํํด๋ณด๊ธฐ. (1) | 2023.07.13 |
[SQL] : ๊ตฌ์กฐํ๋ ์ฟผ๋ฆฌ ์ธ์ด = Structured Query Language (0) | 2023.07.13 |
<TIL> / SQL ๋ฌธ๋ฒ ์ด ์ ๋ฆฌ (0) | 2023.05.14 |