บทช่วยสอนต่อไปนี้จะอธิบายคีย์ต่างประเทศของ Foreign Key ที่มีข้อจำกัด Set Null On Delete ใน SQL Server
คีย์ต่างประเทศที่มี Set NULL on Delete ใน SQL Server คืออะไร
คีย์ต่างประเทศถูกผูกไว้เพื่อตั้งค่า Null บน Delete หมายความว่าเมื่อเรกคอร์ดในตารางหลักถูกลบ เร็กคอร์ดที่เกี่ยวข้องในตารางย่อยในฟิลด์ค่าคีย์ต่างประเทศจะถูกตั้งค่า เป็นโมฆะ ตารางที่เขียนในตารางย่อยจะไม่ถูกลบออกจาก SQL Server
คีย์ต่างประเทศโดยที่ค่า NULL เมื่อลบสามารถสร้างได้ด้วยคำสั่ง CREATE TABLE หรือ ALTER TABLE
สร้างคีย์ต่างประเทศที่มีข้อจำกัดในการตั้งค่า NULL เมื่อลบด้วยคำสั่ง CREATE TABLE
ไวยากรณ์
CREATETABLE bang_con
(
cot1 kieudulieu [ NULL | NOT NULL ],
cot2 kieudulieu [ NULL | NOT NULL ],
…
CONSTRAINT fk_ten
FOREIGN KEY (cot_con1, cot_con2, … cot_con_n)
REFERENCES bang_me (cot_me1, cot_me2, … cot_me_n)
ON DELETE SET NULL
[ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
);
bang_con
ชื่อของตารางย่อยที่คุณต้องการสร้าง
cot1, cot2
คอลัมน์ที่คุณต้องการสร้างในตาราง แต่ละคอลัมน์มี 1 ประเภทข้อมูล ต้องระบุเพื่อให้มีค่า NULL หรือ NOT NULL มิฉะนั้น ค่าเริ่มต้นจะเป็น NULL
ประเภทข้อมูลใน SQL Server
fk_ten
ชื่อของข้อจำกัดคีย์ต่างประเทศที่จะสร้าง
cot_con1, cot_con2, . cot_con_n
คอลัมน์ใน bang_con ต้องการอ้างถึงคีย์หลักใน bang_me
bang_me
ชื่อของตารางหลักมีคีย์หลักที่ใช้ใน bang_con
cot_me1, cot_me2, . cot_me_n
คอลัมน์ที่ประกอบเป็นคีย์หลักใน bang_me Foreign Key จะสร้างข้อจำกัดระหว่าง data และคอลัมน์ cot_con1, cot_con2, . cot_con_n ใน bang_con
เมื่อลบ SET NULL
ข้อมูลในตารางย่อยจะถูกตั้งค่าเป็น NULL เมื่อข้อมูลในตารางหลักถูกลบ ข้อมูลย่อยไม่ถูกลบ
กำลังอัปเดต
ตัวเลือก ระบุว่าจะทำอย่างไรกับข้อมูลย่อยเมื่อมีการอัพเดตข้อมูลหลัก มีตัวเลือก NO ACTION, CASCADE, SET NULL และ SET DEFAULT
ไม่มีการดำเนินการ
ใช้กับ ON DELETE หรือ ON UPDATE นั่นคือไม่ทำอะไรกับข้อมูลลูกเมื่อข้อมูลหลักถูกลบหรืออัปเดต
CASCADE
ใช้กับ ON DELETE หรือ ON UPDATE ซึ่งหมายความว่าข้อมูลลูกจะถูกลบหรืออัปเดตเมื่อข้อมูลหลักถูกลบหรืออัปเดต
ตั้งค่าเป็นโมฆะ
ใช้กับ ON DELETE หรือ ON UPDATE หมายความว่าข้อมูลลูกถูกตั้งค่าเป็น NULL เมื่อข้อมูลหลักถูกลบหรืออัปเดต
ตั้งค่าเริ่มต้น
ใช้กับ ON DELETE หรือ ON UPDATE หมายความว่าข้อมูลลูกถูกตั้งค่าเป็นค่าเริ่มต้นเมื่อข้อมูลหลักถูกลบหรืออัปเดต
ตัวอย่างเช่น
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,
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
);
ในตัวอย่างนี้ เราได้สร้างตารางพาเรนต์ sanpham พร้อมคีย์หลักรวมถึงฟิลด์ข้อมูล id_sanpham แล้วมีตารางลูกชื่อหางต้นค้อพร้อมกุญแจต่างประเทศที่มีข้อจำกัดในการลบ คำสั่ง CREATE TABLE สร้าง foreign key บนตาราง hangtonkho ชื่อ fk_htk_id_sanpham Foreign Key จะสร้างความสัมพันธ์ระหว่างคอลัมน์ id_sanpham ในตาราง hangtonkho และ id_sanpham ในตาราง sanpham
ระบุคีย์ต่างประเทศนี้ใน DELETE SET NULL เพื่อบอก SQL Server ว่าจำเป็นต้องตั้งค่าเร็กคอร์ดที่สอดคล้องกันในตารางย่อยเป็น NULL เมื่อข้อมูลในตารางหลักเป็น ถูกลบ ในตัวอย่างนี้ เมื่อ id_sanpham ถูกลบออกจากตาราง ระเบียนที่เกี่ยวข้องในตาราง hangtonkho โดยใช้ id_sanpham จะถูกตั้งค่าเป็น NULL
เป็นสิ่งสำคัญที่จะต้องทราบว่าเนื่องจากคอลัมน์ id_sanpham ในตาราง hangtonkho จะถูกตั้งค่าเป็น NULL จำเป็นต้องตรวจสอบให้แน่ใจว่าคอลัมน์นี้ได้รับอนุญาตให้รับค่า NULL หากตั้งค่าเป็น NOT NULL เมื่อสร้างด้วย CREATEA จะพบข้อผิดพลาดต่อไปนี้
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)
ON DELETE SET NULL
);
Msg 1761, Level 16, State 0, Line 1
Cannot create the foreign key 'fk_htk_id_sanpham' with the SET NULL referential action, because one or more referencing columns are not nullable.
Msg 1750, Level 16, State 0, Line 1
Could
thể tạo constraint hoặc chỉ mục. Xem lỗi trước.
ตรวจสอบให้แน่ใจว่าคุณกำหนดคอลัมน์ id_sanpham ในตาราง hangtonkho เพื่อรับค่า NULL ดังที่แสดงด้านล่าง
CREATE TABLE hangtonkho
( id_hangtonkho INT PRIMARY KEY,
id_sanpham INT,
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
);
Comma
nd (s) completed successfully.
การสร้างคีย์นอกที่มีข้อจำกัดตั้งค่า NULL เมื่อลบด้วยคำสั่ง ALTER TABLE
ไวยากรณ์
ALTER TABLE state_con
ADD CONSTRAINT fk_ten
FOREIGN KEY (cot_con1, cot_con2, . cot_con_n)
REFERENCES bang_me (cot_me1, cot_me2, . cot_me_n)
ON DELETE SET NULL;
bang_con
ชื่อของตารางย่อยที่คุณต้องการสร้าง
fk_ten
ชื่อของข้อจำกัดคีย์ต่างประเทศที่จะสร้าง
cot_con1, cot_con2, . cot_con_n
คอลัมน์ใน bang_con ต้องการอ้างถึงคีย์หลักใน bang_me
bang_me
ชื่อของตารางหลักมีคีย์หลักที่ใช้ใน bang_con
cot_me1, cot_me2, . cot_me_n
คอลัมน์ที่ประกอบเป็นคีย์หลักใน bang_me Foreign Key จะสร้างข้อจำกัดระหว่าง data และคอลัมน์ cot_con1, cot_con2, . cot_con_n ใน bang_con
เมื่อลบ SET NULL
ระบุว่าข้อมูลลูกจะถูกตั้งค่าเป็น NULL เมื่อข้อมูลในตารางหลักถูกลบ ข้อมูลในตารางย่อยจะไม่ถูกลบ
ตัวอย่างเช่น
ALTER TABLE hangtonkho
ADD CONSTRAINT fk_htk_id_sanpham
FOREIGN KEY (id_sanpham)
REFERENCES sanpham (id_sanpham)
ON DELETE
SET NULL;
ในตัวอย่างนี้ ตารางย่อยของ hangtonkho ถูกสร้างขึ้นด้วยคีย์นอกที่ชื่อ fk_htk_id_sanpham โดยอ้างอิงถึงตารางหลัก sanpham ตาม id_sanpham
การระบุ ON DELETE SET NULL สำหรับ SQL Server เพื่อให้เข้าใจว่าเมื่อข้อมูล id_sanpham ในตารางหลักถูกลบ เร็กคอร์ดที่เกี่ยวข้องในตารางย่อย hangtonkho จะถูกตั้งค่าเป็น NULL