Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> SQL Server

Foreign Key พร้อม Set Null ใน SQL Server

บทช่วยสอนต่อไปนี้จะอธิบายคีย์ต่างประเทศของ 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

ไวยากรณ์

  CREATE TABLE 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 TA BLE 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 TABL E 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 h angtonkho 
( 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 T ABLE 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