จะใช้ RESTRICT สำหรับ Foreign Key ใน mysql ได้อย่างไร


11

ในโครงสร้างฐานข้อมูลของ

  CREATE TABLE Country (
  name varchar(40) NOT NULL,
  PRIMARY KEY  (name)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

CREATE TABLE City (
  name varchar(40) NOT NULL,
  PRIMARY KEY  (name)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

CREATE TABLE Map (
  country varchar(40) NOT NULL,
  city varchar(100) NOT NULL,
  PRIMARY KEY  (country,city),
  FOREIGN KEY (country) REFERENCES Country (name) ON DELETE CASCADE,
  FOREIGN KEY (city) REFERENCES City (name) ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

ฉันคาดว่าจะลบพาเรนต์ออกCityโดยปล่อยให้ค่าที่สอดคล้องกันในชายน์เหมือนเดิมโดยคำสั่งที่เท่าเทียมกันทั้งสามนี้

  FOREIGN KEY (city) REFERENCES City (name) ON DELETE NO ACTION
  FOREIGN KEY (city) REFERENCES City (name) ON DELETE RESTRICT
  FOREIGN KEY (city) REFERENCES City (name)

แต่เมื่อมีการใช้NO ACTIONหรือหรือถนัดRESTRICT ON DELETEMySQL ไม่อนุญาตให้ฉันลบออกจากคอลัมน์หลักด้วยข้อผิดพลาดนี้:

ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails 
('test'.'Map', CONSTRAINT 'Map_ibfk_2' FOREIGN KEY ('city') REFERENCES 'City'('name')
 ON DELETE RESTRICT

ฉันผิดตรงไหน มันเป็นความรับผิดชอบของ SQL ที่NO ACTIONจะลบผู้ปกครองและออกจากเด็กกำพร้า?

คำตอบ:


13

ตามเอกสาร MySQL เกี่ยวกับ DELETE RESTRICT

•ข้อ จำกัด : ปฏิเสธการดำเนินการลบหรืออัปเดตสำหรับตารางหลัก การระบุ RESTRICT (หรือ NO ACTION) จะเหมือนกับการไม่ใช้คำสั่ง ON DELETE หรือ ON UPATE

สำหรับการกระทำที่ไม่

•ไม่ดำเนินการ: คำหลักจาก SQL มาตรฐาน ใน MySQL เทียบเท่ากับ RESTRICT InnoDB ปฏิเสธการดำเนินการลบหรืออัปเดตสำหรับตารางหลักหากมีค่าคีย์ต่างประเทศที่เกี่ยวข้องในตารางอ้างอิง ระบบฐานข้อมูลบางระบบมีการตรวจสอบรอการตัดบัญชีและไม่มีการดำเนินการเป็นการตรวจสอบรอการตัดบัญชี ใน MySQL มีการตรวจสอบข้อ จำกัด คีย์ต่างประเทศทันทีดังนั้นจึงไม่มีการดำเนินการใดเหมือนกับ RESTRICT

DELETE RESTRICT ปกป้องผู้ปกครองจากการลบไม่ใช่ลูก


5

หากคุณต้องการที่จะลบผู้ปกครองและออกจากเด็กแล้วคุณอาจต้องการON DELETE SET NULLตัวเลือก:

SET NULL: ลบหรืออัปเดตแถวจากตารางหลักและตั้งค่าคอลัมน์หรือคอลัมน์คีย์ต่างประเทศในตารางย่อยเป็น NULL สนับสนุนทั้ง ON SET SET NULL และ ON NATE SET NULL clause

ถ้าคุณระบุการกระทำ SET NULL ตรวจสอบให้แน่ใจว่าคุณไม่ได้ประกาศคอลัมน์ในตารางลูกเป็น NOT NULL

มีจำนวนมาก 'ไม่' ในประโยคสุดท้ายดังนั้นเพียงตรวจสอบให้แน่ใจ parent_id สามารถเป็น NULL ได้

ดูการทดสอบที่เกี่ยวข้องนี้: อะไรคือจุดประสงค์ของ SET NULL ในข้อ จำกัด การลบ / อัพเดทคีย์ต่างประเทศ?

โดยการกำหนด foreign key คุณได้บอกให้ฐานข้อมูลไม่ยอมรับรายการในตารางลูกที่ไม่มีค่าที่สอดคล้องกันใน parent

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.