พื้นฐานของคีย์ต่างประเทศใน MySQL?


91

มีคำอธิบายที่ดีเกี่ยวกับการใช้โครงสร้างคีย์ต่างประเทศของ MySQL หรือไม่?

ฉันไม่ค่อยได้รับจากเอกสาร MySQL จนถึงตอนนี้ฉันได้จัดการสิ่งต่างๆเช่นคีย์ต่างประเทศด้วยการรวมและรหัสการเขียนโปรแกรม

และส่วนที่สองของคำถามมีการปรับปรุงโดยใช้ Foreign Key ของ MySQL หรือไม่?

คำตอบ:


117

FOREIGN KEYS เพียงตรวจสอบให้แน่ใจว่าข้อมูลของคุณสอดคล้องกัน

พวกเขาไม่ได้ปรับปรุงการสืบค้นในแง่ของประสิทธิภาพเพียงแค่ทำให้การสืบค้นผิดพลาดล้มเหลว

หากคุณมีความสัมพันธ์เช่นนี้:

CREATE TABLE department (id INT NOT NULL)
CREATE TABLE employee (id INT NOT NULL, dept_id INT NOT NULL, FOREIGN KEY (dept_id) REFERENCES department(id))

แล้วคุณไม่สามารถลบdepartmentถ้ามันมีบางส่วนemployeeของ

หากคุณON DELETE CASCADEระบุFOREIGN KEYคำจำกัดความแถวอ้างอิงจะถูกลบโดยอัตโนมัติพร้อมกับแถวที่อ้างอิง

ตามข้อ จำกัดFOREIGN KEYทำให้การค้นหาช้าลงเล็กน้อย

ต้องมีการตรวจสอบเพิ่มเติมเมื่อลบออกจากตารางที่อ้างอิงหรือแทรกลงในตารางอ้างอิง


1
การชะลอตัวมีน้อยมากเนื่องจากโดยปกติคุณจะสร้าง FK ในฟิลด์ที่จัดทำดัชนีซึ่งทำให้การค้นหาค่าที่เกี่ยวข้องเป็นเรื่องง่าย
Seb

4
นั่นเป็นเหตุผลที่ฉันเขียนว่า "นิดหน่อย" :) ที่จริงแล้วคุณลบแถวจำนวนมากการอ้างอิงJOINอาจมีประสิทธิภาพน้อยกว่ามากที่ DELETE สองรายการใช้ FULL TABLE SCAN
Quassnoi

2
ขออภัยสำหรับการโหวตที่ลง มันเป็นเรื่องบังเอิญ แต่ไม่อนุญาตให้ฉันเปลี่ยนการโหวตของฉัน
Wondercricket

8
@Wondercricket: ตอนนี้ฉันไม่รู้ด้วยซ้ำว่ามันเป็นพื้นที่สีเทาในกฎของไซต์ ฉันคิดว่าคุณซื้อเบียร์ให้ฉันตอนที่คุณอยู่ที่มอสโคว์และเราก็ถึงแล้ว
Quassnoi

1
@stack: การอัปเดตใด ๆ ที่คุณทำกับคีย์ที่อ้างอิงไปยังตารางอ้างอิง
Quassnoi

32

ประโยชน์หลักของการใช้คีย์ต่างประเทศจริงคือการรับรองความสมบูรณ์ของข้อมูลและความสามารถในการตั้งค่าการดำเนินการแบบเรียงซ้อนในรายการที่เกี่ยวข้องเมื่อมีการแก้ไขหรือลบบางสิ่ง

ตัวอย่างเช่นสมมติว่าคุณกำลังเขียนโปรแกรมฟอรัม คุณมีตาราง "หัวข้อ" ที่มีคีย์หลักtopics.topic_idและคุณมีตาราง "โพสต์" ที่มีการแนบโพสต์กับหัวข้อพร้อมกับคอลัมน์posts.topic_idซึ่งเป็นคีย์ต่างประเทศของตารางหัวข้อ

ความสัมพันธ์คีย์ภายนอกนี้ช่วยให้มั่นใจได้ว่าทุกโพสต์จะแนบกับหัวข้อที่ถูกต้อง หากหัวข้อเดียวที่คุณมี ID # 1 เป็นไปไม่ได้ที่จะมีโพสต์ในฐานข้อมูลที่แนบมากับหัวข้อ # 2 ฐานข้อมูลช่วยให้มั่นใจได้

เพื่อประโยชน์ในการเรียงซ้อนคุณสามารถตั้งค่าเพื่อให้หากหัวข้อถูกลบออกจากตารางหัวข้อฐานข้อมูลจะลบโพสต์ทั้งหมดในตารางโพสต์ที่แนบมากับหัวข้อนี้โดยอัตโนมัติ นี่เป็นสิ่งที่ดีเพราะเป็นการลบขั้นตอนที่คุณต้องจำไว้ว่าต้องทำด้วยตนเองซึ่งจะค่อนข้างซับซ้อนเมื่อคุณมีตารางจำนวนมากที่เชื่อมโยงกัน ด้วยคีย์ต่างประเทศความสัมพันธ์ทั้งหมดจะถูกล้างโดยอัตโนมัติ


11

1. คีย์ต่างประเทศเพียงแค่ตรวจสอบว่าข้อมูลของคุณสอดคล้องกัน

2. ถ้าเราใช้ลบ cascade กับนิยามคีย์นอกแถวอ้างอิงจะลบโดยอัตโนมัติเมื่อแถวแม่จะลบ

3. ถ้าเราใช้ Update Cascade กับนิยาม Foreign Key แถวลูกจะอัปเดตโดยอัตโนมัติเมื่อแถวแม่จะอัปเดต

แบบสอบถาม: แก้ไขตารางลูกเพิ่มคีย์ต่างประเทศ (parent_id) อ้างอิงพาเรนต์ (id) ในการอัปเดต CASCADE บนลบ CASCADE;

  1. คุณไม่สามารถลบตารางพาเรนต์โดยตรงได้ก่อนอื่นให้ลบคีย์นอกจากตารางลูกแทนที่จะลบตารางพาเรนต์

7
ในที่สุดก็ตระหนักถึงสิ่งที่ทำให้ฉันสับสนเกี่ยวกับตัวอย่างคีย์ต่างประเทศ ขณะที่พ่อของสี่ผมไม่ได้ใช้ในการติดตามการรักษาลูกของแม่ ในอีกสี่สิบปีหรือมากกว่านั้นสิ่งนี้อาจดูเหมือนไม่ถอยหลังอีกต่อไป
Bob Stein

1
ขอขอบคุณที่ตั้งชื่อตารางตัวอย่างเช่น "child" และ "parent" ... จริงๆแล้วมันค่อนข้างมีประโยชน์และฉันหวังว่าเอกสารอย่างเป็นทางการจะทำได้!
หนูไมค์

7

ข้อได้เปรียบหลักคือคุณสามารถ จำกัด ค่าที่คุณสามารถป้อนในตารางได้ หากคุณพยายามป้อนค่าที่ไม่มีอยู่ในตารางที่อ้างอิงคุณจะไม่สามารถทำได้

นอกจากนี้หากคุณอัปเดตหรือลบค่าในตารางที่อ้างอิงคุณสามารถตั้งค่าให้อัปเดตค่าโดยอัตโนมัติหรือลบในเรียงซ้อนแถวใดก็ได้ที่มีค่านั้น

เป็นคุณสมบัติที่ยอดเยี่ยมในการใช้ประโยชน์จากโค้ดของคุณ

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