วิธีใช้ MySQL Foreign Key Constraints

How Use Mysql Foreign Key Constraints



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

คุณสมบัติของข้อจำกัดของคีย์ต่างประเทศ:

คุณสมบัติที่สำคัญบางประการของข้อจำกัดของคีย์ต่างประเทศได้อธิบายไว้ด้านล่าง







  • ชนิดข้อมูลของ foreign key ที่ใช้ในตารางย่อยต้องเหมือนกันกับชนิดข้อมูลของคีย์หลักที่ใช้ในตารางหลักเพื่ออ้างอิง foreign key
  • คอลัมน์ดัชนีหรือหลายคอลัมน์สามารถอ้างอิงเป็นคีย์นอกสำหรับตาราง InnoDB เท่านั้น
  • ต้องใช้สิทธิ์ในการอ้างอิงหรือสิทธิ์อย่างน้อยหนึ่งสิทธิ์ของคำสั่ง SELECT, INSERT, UPDATE และ DELETE เพื่อสร้างคีย์นอก
  • คีย์ต่างประเทศสามารถสร้างได้สองวิธี หนึ่งโดยใช้คำสั่ง CREATE และอีกอันโดยใช้คำสั่ง ALTER

วิชาบังคับก่อน:

ก่อนสร้างข้อจำกัดของคีย์นอก คุณต้องสร้างฐานข้อมูลและตารางพาเรนต์ด้วยคีย์หลัก สมมติว่าชื่อฐานข้อมูลคือ ' ห้องสมุด ' และประกอบด้วยตารางหลักสองตารางชื่อ ' หนังสือ ' และ ' ผู้กู้ ’ ทำการเชื่อมต่อกับเซิร์ฟเวอร์ MySQL โดยใช้ mysql ไคลเอ็นต์และเรียกใช้คำสั่ง SQL ต่อไปนี้เพื่อสร้างฐานข้อมูลและตาราง



สร้าง ฐานข้อมูล ห้องสมุด;
ใช้ ห้องสมุด;

สร้าง ตาราง หนังสือ(
NS INT ไม่ โมฆะ AUTO_INCREMENT ,
ชื่อ วาร์ชาร์ (ห้าสิบ) ไม่ โมฆะ ,
ผู้เขียน วาร์ชาร์ (ห้าสิบ) ไม่ โมฆะ ,
สำนักพิมพ์ วาร์ชาร์ (ห้าสิบ) ไม่ โมฆะ ,
คีย์หลัก (NS)
) เครื่องยนต์ = INNODB ;

สร้าง ตาราง ผู้กู้(
NS VARCHAR (ห้าสิบ) ไม่ โมฆะ ,
ชื่อ วาร์ชาร์ (ห้าสิบ) ไม่ โมฆะ ,
ที่อยู่ วาร์ชาร์ (ห้าสิบ) ไม่ โมฆะ ,
อีเมล วาร์ชาร์ (ห้าสิบ) ไม่ โมฆะ ,
คีย์หลัก (NS)
) เครื่องยนต์ = INNODB ;



กำหนด Foreign Key Constraint โดยใช้คำสั่ง CREATE

สร้างตารางชื่อ ' book_borrow_info ' ด้วยข้อ จำกัด ของคีย์ต่างประเทศโดยดำเนินการคำสั่งต่อไปนี้ ที่นี่ book_id สนามคือ กุญแจต่างประเทศ สำหรับตารางนี้และทุกค่าของฟิลด์นี้จะต้องมีอยู่ใน NS ที่ดินของ หนังสือ ตาราง. หนังสือ เป็นตารางหลักและ book_borrow_info เป็นโต๊ะของลูก มีการตั้งค่าข้อจำกัดสองข้อด้วยรหัสต่างประเทศที่นี่ เหล่านี้คือ ลบ CASCADE และ อัปเดต CASCADE . นั่นหมายความว่าหากมีคีย์หลักใด ๆ ที่จะลบหรืออัปเดตจากตารางหลัก เร็กคอร์ดที่เกี่ยวข้องที่เกี่ยวข้องกับตารางย่อยที่เกี่ยวข้องกับคีย์ภายนอกจะถูกลบออกหรือจะมีการอัพเดตคีย์ภายนอก





สร้าง ตาราง book_borrow_info(
ยืม_id VARCHAR (ห้าสิบ),
book_id INT ,
ยืม_date วันที่ ไม่ โมฆะ ,
return_date วันที่ ไม่ โมฆะ ,
สถานะ VARCHAR (สิบห้า) ไม่ โมฆะ ,
ดัชนี par_ind(book_id),
คีย์หลัก (ยืม_id,ยืม_date),
กุญแจต่างประเทศ (book_id) ข้อมูลอ้างอิง หนังสือ(NS)
บน ลบ น้ำตก
บน อัปเดต น้ำตก
) เครื่องยนต์ = INNODB ;

ตอนนี้ เรียกใช้คำสั่ง SQL ต่อไปนี้เพื่อแทรกบางระเบียนในทั้งสองตาราง คำสั่ง INSERT แรกจะแทรกสี่ระเบียนลงใน หนังสือ ตาราง. สี่ค่าของ NS ที่ดินของ หนังสือ ตารางจะเป็น 1, 2, 3 และ 4 สำหรับแอตทริบิวต์การเพิ่มอัตโนมัติ คำสั่ง INSERT ที่สองจะแทรกสี่ระเบียนลงใน book_borrow_info ขึ้นอยู่กับ NS มูลค่าของ หนังสือ ตาราง.



แทรก เข้าไปข้างใน หนังสือ ค่า
( โมฆะ , 'เพื่อฆ่าม็อกกิ้งเบิร์ด', 'ฮาร์เปอร์ ลี', 'สำนักพิมพ์แกรนด์เซ็นทรัล'),
( โมฆะ , 'หนึ่งร้อยปีแห่งความโดดเดี่ยว', 'การ์เซีย มาร์เกซ', 'ลุตฟี ออซก็อก'),
( โมฆะ , 'เส้นทางสู่อินเดีย', 'ฟอร์สเตอร์ อีเอ็ม', 'ห้องสมุดรูปภาพ BBC Hulton'),
( โมฆะ , 'มนุษย์ล่องหน', 'ราล์ฟ เอลลิสัน', 'สารานุกรมบริแทนนิกา, Inc.');

แทรก เข้าไปข้างใน book_borrow_info ค่า
('123490', 1, '2020-02-15', '2020-02-25', 'กลับมา'),
('157643', 2, '2020-03-31', '2020-03-10', 'รอดำเนินการ'),
('174562', 4, '2020-04-04', '2020-04-24', 'ยืม'),
('146788', 3, '2020-04-10', '2020-01-20', 'ยืม');

หากคุณพยายามแทรกค่าในฟิลด์ foreign key ของตารางย่อยที่ไม่มีอยู่ในฟิลด์คีย์หลักของตารางพาเรนต์ MySQL จะสร้างข้อผิดพลาด คำสั่ง SQL ต่อไปนี้จะสร้างข้อผิดพลาดเนื่องจากตารางพาเรนต์ หนังสือ ไม่มีค่ารหัสใด ๆ 10 .

แทรก เข้าไปข้างใน book_borrow_info ค่า
('195684', 10, '2020-04-15', '2020-04-30', 'กลับมา');

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

ลบ จาก หนังสือ ที่ไหน NS= 4;
เลือก * จาก หนังสือ;
เลือก * จาก book_borrow_info;

กำหนดข้อจำกัดของ Foreign Key โดยใช้คำสั่ง ALTER

ขั้นแรกให้แทรกบันทึกบางส่วนลงใน ผู้กู้ ตารางและตารางนี้จะถูกกำหนดเป็นตารางหลักในตอนหน้า อายุ คำแถลง.

แทรก เข้าไปข้างใน ผู้กู้ ค่านิยม
('123490', 'แพทริค วูด', '34 เวสต์สตรีท LANCASTER LA14 9ZH', ' [ป้องกันอีเมล] '),
('157643', 'เอซร่า มาร์ติน', '10 เดอะโกรฟ เบอร์มิงแฮม B98 1EU', ' [ป้องกันอีเมล] '),
('174562', 'จอห์น อินเนส อาร์ชี', '55 ถนนสายหลัก LIVERPOOL L2 3OD', ' [ป้องกันอีเมล] '),
('146788', 'เฟรเดอริค แฮนสัน', '85 ถนนไฮฟิลด์ ชรูว์สเบอรี่ SY46 3ME', ' [ป้องกันอีเมล] ');

เรียกใช้สิ่งต่อไปนี้ อายุ คำสั่งเพื่อกำหนดข้อ จำกัด คีย์ต่างประเทศอื่นสำหรับ book_borrow_info ตารางเพื่อสร้างความสัมพันธ์กับ ผู้กู้ ตาราง. ที่นี่, ยืม_id ถูกกำหนดให้เป็นกุญแจต่างประเทศสำหรับ book_borrow_info ตาราง.

แก้ไขตาราง book_borrow_info เพิ่มข้อจำกัด fk_borrower
กุญแจต่างประเทศ(ยืม_id)ผู้กู้อ้างอิง(NS)ON ลบ CASCADE ในการจำกัดการอัปเดต;

ตอนนี้แทรกบันทึกลงใน book_borrow_info ด้วยความถูกต้อง ยืม_id คุณค่าที่มีอยู่ใน NS ที่ดินของ ผู้กู้ ตาราง. 157643 ค่าที่มีอยู่ในตารางผู้กู้และคำสั่ง INSERT ต่อไปนี้จะถูกดำเนินการสำเร็จ

แทรก เข้าไปข้างใน book_borrow_info ค่า
('157643', 1, '2020-03-10', '2020-03-20', 'กลับมา');

คำสั่ง INSERT ต่อไปนี้จะสร้างข้อความแสดงข้อผิดพลาดเนื่องจากค่า id 195680 ไม่มีอยู่ในตารางผู้กู้

แทรก เข้าไปข้างใน book_borrow_info ค่า
('195680', 1, '2020-04-15', '2020-04-30', 'กลับมา');

บทสรุป:

การกำหนดข้อจำกัดของคีย์ภายนอกอย่างเหมาะสมเป็นงานที่สำคัญมากสำหรับการสร้างฐานข้อมูลเชิงสัมพันธ์และจัดการข้อมูลระหว่างตารางอย่างเหมาะสม การรู้การใช้ข้อจำกัดของคีย์ต่างประเทศเป็นสิ่งสำคัญมากสำหรับนักออกแบบฐานข้อมูล ฉันหวังว่าบทความนี้จะช่วยให้ผู้ออกแบบฐานข้อมูลใหม่เข้าใจแนวคิดของข้อจำกัดของคีย์ต่างประเทศและนำไปใช้อย่างเหมาะสมในงานของตน