๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
DB

[SQL] : ์ œ์•ฝ์กฐ๊ฑด ์•Œ์•„๋ณด๊ธฐ.

by ๊ถŒ์Šพํ–„ 2023. 7. 13.
์ œ์•ฝ์กฐ๊ฑด ?

์ œ์•ฝ์กฐ๊ฑด์€ ๊ฐ ์ปฌ๋Ÿผ๋“ค๊ฐ„์˜ ์ œํ•œ์‚ฌํ•ญ์„ ๊ด€๋ฆฌํ•˜๊ณ , ์กฐ๊ฑด์„ ์œ„๋ฐ˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฉ์ง€ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์™„์ „์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ๊ทœ์น™์ž…๋‹ˆ๋‹ค.

์ œ์•ฝ ์กฐ๊ฑด์˜ ์ข…๋ฅ˜
  • ๊ณ ์œ (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