การควบคุมความสมบูรณ์ของฐานข้อมูล
สิ่งสำคัญอีกอย่างที่ต้องรู้เกี่ยวกับฐานข้อมูลคือ CONSTRAINS ด้วยความช่วยเหลือของข้อจำกัด คุณสามารถควบคุมการเปลี่ยนแปลงข้อมูลในตารางของคุณ และรักษาความสมบูรณ์และความสอดคล้องได้
ความสอดคล้องของข้อมูลเมื่อเราพูดถึงฐานข้อมูลคืออะไร ?
ลองนำร้านค้าออนไลน์ของเราที่มีตารางพนักงาน ผลิตภัณฑ์ และงาน เรารู้อยู่แล้วว่าอาจมีงานในตารางงานที่ไม่ได้มอบหมายให้ใครเลย: รหัสพนักงานของแถวดังกล่าวคือ NULL
แต่จะเกิดอะไรขึ้นถ้ามีรายการในตารางงานที่มี Employee_id เท่ากับ 115 ท้ายที่สุดเราไม่มีพนักงานดังกล่าว เราไม่มีพนักงานที่มี id = 115 ในตารางพนักงาน ในขณะเดียวกัน ลิงก์ไปยังพนักงานที่มีรหัสนี้จะอยู่ในตารางงาน นี่คือตัวอย่างของ ความไม่สอดคล้อง กันของข้อมูล
แล้วเราจะกระทบยอดข้อมูลเหล่านี้ได้อย่างไร? ตามหลักการแล้ว เซิร์ฟเวอร์ SQL จะควบคุมความแตกต่างเหล่านี้เมื่อมีการเปลี่ยนแปลงข้อมูลใดๆ และมีโอกาสเช่นนี้ เรียกว่า FOREIGN_KEY
หากบางคอลัมน์ในตารางของคุณไม่ได้มีแค่ตัวเลข แต่ยังมีแถวรหัสจากตารางอื่นด้วย คุณสามารถระบุสิ่งนี้ได้อย่างชัดเจน
การเพิ่มคีย์ต่างประเทศ
คีย์ดังกล่าวสามารถเพิ่มลงในตารางได้ทั้งในขั้นตอนของการสร้างและหลังจากนั้นโดยใช้ ALTER TABLE รูปแบบไม่แตกต่างกันโดยพื้นฐาน เราจะนำเสนอทั้งสองตัวเลือก
รูปแบบทั่วไปของคีย์/กฎดังกล่าวคือ:
FOREIGN KEY (column)
REFERENCES table(column)
เรามาเพิ่มคีย์/กฎนี้ใน ตาราง งานเพื่อให้แน่ใจว่าEmployee_ids ทั้งหมด จากตารางอ้างอิงถึงรายการที่มีอยู่ในตารางพนักงาน สคริปต์นี้จะมีลักษณะดังนี้:
ALTER TABLE task
ADD FOREIGN KEY (employee_id)
REFERENCES employee(id)
และถ้าเราตัดสินใจเพิ่มกฎนี้ในขณะที่สร้างตารางงาน โค้ดจะมีลักษณะดังนี้:
CREATE TABLE task (
id INT,
name VARCHAR(100),
employee_id INT,
deadline DATE,
PRIMARY KEY (id),
FOREIGN KEY (employee_id)
REFERENCES employee(id)
);
อย่างไรก็ตาม มีบางสถานการณ์ที่สตริงที่เราอ้างถึงมีคีย์ผสมที่ไม่ซ้ำกัน ตัวอย่างเช่น “ชื่อและปีเกิด” หรือ “productCatogoryId และ productId” จากนั้น FOREIGN KEY สามารถเขียนได้ดังนี้:
FOREIGN KEY (our_column1, our_column2)
REFERENCES table(their_column1, their_column2)
FOREIGN KEY และการเปลี่ยนแปลงข้อมูล
ลองนึกภาพสถานการณ์ที่เราตัดสินใจอัปเดตข้อมูลบางอย่างในตารางพนักงานและรหัสพนักงานของเราเปลี่ยนไป จะเกิดอะไรขึ้นกับข้อมูลในตารางงาน? ถูกต้อง พวกเขาจะไม่เกี่ยวข้องและความสมบูรณ์ของฐานข้อมูลของเราจะถูกละเมิด
เพื่อป้องกันไม่ให้สิ่งนี้เกิดขึ้น คุณสามารถบอก SQL Server ให้เปลี่ยน Employee_id ของแถวทั้งหมดในตารางทั้งหมดที่อ้างถึง id ที่เปลี่ยนแปลงโดยเฉพาะนี้ เมื่อ id ในตารางพนักงานเปลี่ยนไป
สคริปต์ดังกล่าวเรียกว่าOnUpdateและOnDelete จะทำอย่างไรถ้า ID ของเรกคอร์ดเปลี่ยนไป และจะทำอย่างไรถ้าเรกคอร์ดถูกลบ
ด้วยการลบไม่ใช่ทุกอย่างจะง่ายนัก หากคุณมีวัตถุที่อ้างอิงซึ่งแสดงด้วยสตริงในฐานข้อมูลที่อ้างอิงถึงกันและกัน สถานการณ์จำลองลักษณะการทำงานที่หลากหลายจะเป็นไปได้เมื่อลบวัตถุหนึ่งชิ้น
สมมติว่าเราลบผู้ใช้ไซต์ ซึ่งหมายความว่าเราต้องลบการติดต่อส่วนบุคคลทั้งหมดของเขา แต่ไม่น่าเป็นไปได้ที่เราจะลบความคิดเห็นสาธารณะทั้งหมดของเขา
หรือลูกจ้างลาออก. คงจะแปลกถ้าเขาลาออกและในขณะเดียวกันงานทั้งหมดที่มอบหมายให้เขาก็หายไปจากฐานข้อมูล แต่ถ้าพวกเขาไม่ได้รับการแต่งตั้งจากเขา มันก็จะกลับกลายเป็นเรื่องเลวร้ายเช่นกัน ถูกต้องกว่าที่จะทำให้พนักงานสามารถลาออกได้หลังจากมอบหมายงานทั้งหมดให้กับคนอื่น
นี่คือวิธีที่เราสามารถอธิบายสถานการณ์เหล่านี้โดยใช้ FOREIGN KEY รูปแบบทั่วไปของคีย์/กฎดังกล่าวคือ:
FOREIGN KEY (column)
REFERENCES table(column)
[ON DELETE reference_option]
[ON UPDATE reference_option]
จะทำอย่างไรในกรณีที่มีการลบ (ON DELETE) หรือเปลี่ยนแปลง (ON UPDATE) บันทึก? โดยรวมแล้ว อาจมี 5 ตัวเลือกสำหรับเซิร์ฟเวอร์ SQL เพื่อดำเนินการในแต่ละสถานการณ์เหล่านี้:
# | reference_option | คำอธิบาย |
---|---|---|
1 | จำกัด | ปิดการทำงานหากพบการอ้างอิงสตริง |
2 | น้ำตก | เปลี่ยนรหัสในแถวที่ขึ้นต่อกัน |
3 | ตั้งค่าเป็นโมฆะ | ตั้งค่า id ในแถวที่ขึ้นต่อกันเป็น NULL |
4 | ไม่มีการตอบสนอง | ไม่มีอะไรทำ |
5 | ตั้งค่าเริ่มต้น x | ตั้งค่า id ใน sink ที่ขึ้นต่อกันเป็น x |
นี่คือวิธีที่เราสามารถแก้ไขตารางงานของเรา:
ALTER TABLE task
ADD FOREIGN KEY (employee_id)
REFERENCES employee(id)
ON UPDATE CASCADE
ON DELETE RESTRICT;
สิ่งที่เขียนที่นี่:
ON UPDATE CASCADE : ถ้าคีย์ id ในตารางพนักงานเปลี่ยนไป ให้เปลี่ยน Employee_id ในตารางงานที่อ้างอิงถึงมันด้วย
ON DELETE RESTRICT : หากแถวถูกลบออกจากตารางพนักงานและอ้างอิงจากตารางงาน ให้ป้องกันไม่ให้แถวนั้นถูกลบออกจากตารางพนักงาน
GO TO FULL VERSION