Foreign Key คืออะไร?
Foreign Key (FK) ใช้บังคับความสมบูรณ์ของข้อมูลอ้างอิง (Referential Integrity) ค่าในคอลัมน์ FK ของตารางลูก (Child) ต้องมีอยู่ในคอลัมน์ PK ของตารางแม่ (Parent)
1. สร้าง FK พร้อม CREATE TABLE
CREATE TABLE child_table (
col1 data_type [NULL | NOT NULL],
col2 data_type [NULL | NOT NULL],
...
CONSTRAINT fk_name FOREIGN KEY (child_col1, child_col2, ...)
REFERENCES parent_table (parent_col1, parent_col2, ...)
[ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }]
[ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }]
);
ตัวเลือก ON DELETE / ON UPDATE
| พฤติกรรมเมื่อ Parent ถูกลบ/แก้ไข | |
|---|---|
NO ACTION | ไม่ทำอะไร (default) - จะ error หากมี child อยู่ |
CASCADE | ลบ/แก้ไข Child ตามไปด้วย |
SET NULL | ตั้งค่า FK ใน Child เป็น NULL (ต้องอนุญาต NULL) |
SET DEFAULT | ตั้งค่า FK ใน Child เป็น DEFAULT value |
ตัวอย่าง FK เดี่ยว
CREATE TABLE sanpham (
id_sanpham INT PRIMARY KEY,
ten_sanpham VARCHAR(50) NOT NULL,
phan_loai VARCHAR(25)
);
CREATE TABLE hangtonkho (
id_hangtonkho INT PRIMARY KEY,
id_sanpham INT NOT NULL,
soluong INT,
luong_toithieu INT,
luong_toida INT,
CONSTRAINT fk_htk_id_sanpham FOREIGN KEY (id_sanpham)
REFERENCES sanpham (id_sanpham)
);
ตัวอย่าง Composite FK (หลายคอลัมน์)
CREATE TABLE sanpham (
ten_sanpham VARCHAR(50) NOT NULL,
diadiem VARCHAR(50) NOT NULL,
phanloai VARCHAR(25),
CONSTRAINT sanpham_pk PRIMARY KEY (ten_sanpham, diadiem)
);
CREATE TABLE hangtonkho (
id_hangtonkho INT PRIMARY KEY,
ten_sanpham VARCHAR(50) NOT NULL,
diadiem VARCHAR(50) NOT NULL,
soluong INT,
luong_toithieu INT,
luong_toida INT,
CONSTRAINT fk_htk_sanpham FOREIGN KEY (ten_sanpham, diadiem)
REFERENCES sanpham (ten_sanpham, diadiem)
);
2. เพิ่ม FK ด้วย ALTER TABLE
ALTER TABLE child_table
ADD CONSTRAINT fk_name FOREIGN KEY (child_col1, child_col2, ...)
REFERENCES parent_table (parent_col1, parent_col2, ...);
ตัวอย่าง
ALTER TABLE hangtonkho
ADD CONSTRAINT fk_htk_id_sanpham FOREIGN KEY (id_sanpham)
REFERENCES sanpham (id_sanpham);
ALTER TABLE hangtonkho
ADD CONSTRAINT fk_htk_sanpham FOREIGN KEY (ten_sanpham, diadiem)
REFERENCES sanpham (ten_sanpham, diadiem);
ข้อควรระวัง: คอลัมน์ FK ต้องมีชนิดข้อมูลตรงกับ PK ของ Parent ทุกคอลัมน์