Foreign Key SET NULL คืออะไร?
เมื่อระบุ ON DELETE SET NULL ใน Foreign Key แถวในตารางลูก (Child) จะไม่ถูกลบ แต่ค่าคอลัมน์ FK จะถูกตั้งเป็น NULL แทน เมื่อแถวในตารางแม่ (Parent) ถูกลบ
1. สร้างด้วย CREATE TABLE
CREATE TABLE child_table (
col1 data_type [NULL | NOT NULL],
...
CONSTRAINT fk_name FOREIGN KEY (child_col1, ...)
REFERENCES parent_table (parent_col1, ...)
ON DELETE SET NULL
[ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }]
);
ตัวอย่าง
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, -- ต้องยอมรับ NULL
soluong INT,
luong_toithieu INT,
luong_toida INT,
CONSTRAINT fk_htk_id_sanpham FOREIGN KEY (id_sanpham)
REFERENCES sanpham (id_sanpham)
ON DELETE SET NULL
);
สำคัญ: คอลัมน์ id_sanpham ในตาราง Child ต้องอนุญาต NULL (ห้ามเป็น NOT NULL) มิฉะนั้นจะ error:
Msg 1761: Cannot create the foreign key with SET NULL referential action,
because one or more referencing columns are not nullable.
2. เพิ่มด้วย ALTER TABLE
ALTER TABLE child_table
ADD CONSTRAINT fk_name FOREIGN KEY (child_col1, ...)
REFERENCES parent_table (parent_col1, ...)
ON DELETE SET NULL;
ตัวอย่าง
ALTER TABLE hangtonkho
ADD CONSTRAINT fk_htk_id_sanpham FOREIGN KEY (id_sanpham)
REFERENCES sanpham (id_sanpham)
ON DELETE SET NULL;
สรุป: ใช้ ON DELETE SET NULL เมื่อต้องการเก็บแถว Child ไว้ แต่ตัดความสัมพันธ์ออก (FK = NULL) เมื่อ Parent ถูกลบ