อย่าลังเลที่จะใส่ข้อ จำกัด ในฐานข้อมูล คุณจะต้องแน่ใจว่ามีฐานข้อมูลที่สอดคล้องกันและเป็นหนึ่งในเหตุผลที่ดีในการใช้ฐานข้อมูล โดยเฉพาะอย่างยิ่งหากคุณมีแอปพลิเคชั่นหลายตัวที่ร้องขอ (หรือเพียงแอปพลิเคชันเดียว แต่มีโหมดโดยตรงและโหมดแบตช์โดยใช้แหล่งที่มาที่แตกต่างกัน)
ด้วย MySQL คุณไม่ได้มีข้อ จำกัด ขั้นสูงเหมือนอย่างที่คุณมีใน postgreSQL แต่อย่างน้อยก็มีข้อ จำกัด ของ foreign key ค่อนข้างสูง
เราจะยกตัวอย่างตาราง บริษัท ที่มีตารางผู้ใช้ที่มีบุคคลจาก บริษัท เหล่านี้
CREATE TABLE COMPANY (
company_id INT NOT NULL,
company_name VARCHAR(50),
PRIMARY KEY (company_id)
) ENGINE=INNODB;
CREATE TABLE USER (
user_id INT,
user_name VARCHAR(50),
company_id INT,
INDEX company_id_idx (company_id),
FOREIGN KEY (company_id) REFERENCES COMPANY (company_id) ON...
) ENGINE=INNODB;
ลองดูข้อON UPDATE :
- ON UPDATE จํากัด : เริ่มต้น : ถ้าคุณพยายามที่จะปรับปรุง company_id ใน บริษัท ตารางเครื่องยนต์จะปฏิเสธการดำเนินการอย่างใดอย่างหนึ่งของผู้ใช้ในการเชื่อมโยงอย่างน้อยใน บริษัท นี้
- เมื่อ UPDATE ไม่ดำเนินการ : เช่นเดียวกับข้อ จำกัด
- ON CASCADE UPDATE : ดีที่สุดโดยปกติ : หากคุณอัปเดต company_id ในแถวของตาราง บริษัท เครื่องยนต์จะอัปเดตตามลำดับในแถว USER ทั้งหมดที่อ้างอิง บริษัท นี้ (แต่ไม่มีทริกเกอร์เปิดใช้งานบนตาราง USER คำเตือน) เครื่องยนต์จะติดตามการเปลี่ยนแปลงสำหรับคุณมันดี
- ON UPDATE SET NULL : หากคุณอัปเดต company_id ในแถวของตาราง บริษัท เครื่องยนต์จะตั้ง USER ที่เกี่ยวข้อง company_id เป็น NULL (ควรมีอยู่ในฟิลด์ USER company_id) ฉันไม่เห็นสิ่งที่น่าสนใจเกี่ยวกับสิ่งนั้นในการอัปเดต แต่ฉันอาจผิด
และในตอนนี้ทางด้านลบ :
- ON DELETE RESTRICT : ค่าเริ่มต้น : หากคุณพยายามลบรหัส company_id ในตาราง บริษัท เครื่องยนต์จะปฏิเสธการดำเนินการหากผู้ใช้อย่างน้อยหนึ่งลิงก์ของ บริษัท นี้สามารถช่วยชีวิตคุณได้
- เมื่อลบไม่มีการดำเนินการ : เหมือนกับ RESTRICT
- ON DELETE CASCADE : อันตราย : ถ้าคุณลบแถว บริษัท ในตาราง บริษัท เครื่องยนต์จะลบ USER ที่เกี่ยวข้องเช่นกัน สิ่งนี้เป็นอันตราย แต่สามารถใช้เพื่อทำการล้างข้อมูลอัตโนมัติบนตารางรอง (ดังนั้นจึงอาจเป็นสิ่งที่คุณต้องการ แต่ไม่แน่นอนสำหรับ บริษัท <-> ตัวอย่างผู้ใช้)
- ON DELETE SET NULL : หยิบ : ถ้าคุณลบแถว บริษัท ผู้ใช้ที่เกี่ยวข้องจะมีความสัมพันธ์กับ NULL โดยอัตโนมัติ หาก Null เป็นค่าของคุณสำหรับผู้ใช้ที่ไม่มี บริษัท สิ่งนี้อาจเป็นพฤติกรรมที่ดีตัวอย่างเช่นคุณอาจต้องการให้ผู้ใช้อยู่ในแอปพลิเคชันของคุณในฐานะผู้เขียนเนื้อหาบางส่วน แต่การลบ บริษัท นั้นไม่ใช่ปัญหาสำหรับคุณ
มักจะเริ่มต้นของฉันคือ: ON ลบจํากัด ON UPDATE CASCADE ด้วยบางอย่างON DELETE CASCADE
สำหรับตารางติดตาม (บันทึก - ไม่ใช่บันทึกทั้งหมด - สิ่งเช่นนั้น) และON DELETE SET NULL
เมื่อตารางต้นแบบเป็น 'แอตทริบิวต์แบบง่าย' สำหรับตารางที่มีคีย์ต่างประเทศเช่นตาราง JOB สำหรับตาราง USER
แก้ไข
มันนานมากแล้วที่ข้าได้เขียนมัน ตอนนี้ฉันคิดว่าฉันควรเพิ่มคำเตือนที่สำคัญอย่างหนึ่ง MySQL มีข้อ จำกัด ขนาดใหญ่หนึ่งเอกสารที่มีการเรียงซ้อน พรูยังไม่ได้ยิงทริกเกอร์ ดังนั้นหากคุณมีความมั่นใจมากเกินไปในเครื่องมือที่จะใช้ทริกเกอร์คุณควรหลีกเลี่ยงข้อ จำกัด แบบเรียงซ้อน
ทริกเกอร์ MySQL เปิดใช้งานเฉพาะสำหรับการเปลี่ยนแปลงที่เกิดขึ้นกับตารางโดยคำสั่ง SQL พวกเขาไม่เปิดใช้งานสำหรับการเปลี่ยนแปลงในมุมมองหรือโดยการเปลี่ยนแปลงไปยังตารางที่ทำโดย APIs ที่ไม่ส่งงบ SQL ไปยังเซิร์ฟเวอร์ MySQL
==> ดูการแก้ไขล่าสุดด้านล่างสิ่งต่าง ๆ กำลังเคลื่อนไหวในโดเมนนี้
ทริกเกอร์ไม่ได้เปิดใช้งานโดยการกระทำของ foreign key
และฉันไม่คิดว่าสิ่งนี้จะได้รับการแก้ไขในหนึ่งวัน ข้อ จำกัด กุญแจต่างประเทศได้รับการจัดการโดยหน่วยเก็บข้อมูล InnoDb และทริกเกอร์ได้รับการจัดการโดยโปรแกรม MySQL SQL ทั้งสองแยกจากกัน Innodb เป็นที่เก็บข้อมูลเดียวที่มีการจัดการข้อ จำกัด บางทีพวกเขาอาจจะเพิ่มทริกเกอร์ในเครื่องมือจัดเก็บข้อมูลได้โดยตรงในวันหนึ่งอาจจะไม่ใช่
แต่ฉันมีความเห็นของฉันเองเกี่ยวกับองค์ประกอบที่คุณควรเลือกระหว่างการใช้งานทริกเกอร์ที่ไม่ดีกับข้อ จำกัด ของคีย์ต่างประเทศที่มีประโยชน์มาก และเมื่อคุณคุ้นเคยกับฐานข้อมูลแล้วคุณจะรัก PostgreSQL
12 / 2560- อัปเดตการแก้ไขนี้เกี่ยวกับ MySQL:
ตามที่ระบุโดย @IstiaqueAhmed ในความคิดเห็นสถานการณ์มีการเปลี่ยนแปลงในเรื่องนี้ ดังนั้นติดตามลิงค์และตรวจสอบสถานการณ์ล่าสุด (ซึ่งอาจมีการเปลี่ยนแปลงอีกในอนาคต)
ON DELETE CASCADE : dangerous
- ใช้เกลือเล็กน้อย