6/07/2561

วิธีสร้าง Foreign Key บน MySQL

การสร้าง Foreign Key บน MySQL ด้วย phpmyadmin (How to create foreign key on MySQL with phpmyadmin)โดย Foreign Key ก็คือคีย์ร่วมที่ทำหน้าที่เชื่อมโยงความสัมพันธ์ระหว่างตารางนั่นเองหากคีย์นอกมีการเปลี่ยนแปลงก็จะส่งผลต่อการเชื่อมโยงข้อมูลระหว่างตารางตามเงื่อนไขที่เราได้กำหนดไว้ โดยข้อจำกัด ของความสัมพันธ์ระหว่างตารางที่เราสร้างเรามักจะเรียกว่า Constraint โดยการกำหนดรูปแบบของความสัมพันธ์ของ Constraint จะมีอยู่สองกรณี คือ on delete และ on update และแต่ละกรณีสามารถกำหนดข้อจำกัดของความสัมพันธ์ได้โดยมี keyword ซึ่งคำเหล่านี้จะนำไปเติมไว้ด้านหลังเงือนไข โดยมีความฟมายดังต่อไปนี้
1. Cascade คือเมื่อกำหนด keyword cascade เข้าไปด้านหลัง เช่น on delete cascade จะหมายความว่าให้ทำการลบโดยไม่ต้องสนใจความสัมพันธ์ระหว่างตาราง
2. Set null คือกำหนดให้เป็นค่าว่างใน field นั้นๆที่มีข้อจำกัดความสัมพันธ์เช่น on delete set null โดยเมื่อทำการลบข้อมูลใน field ที่อ้างอิงระหว่างตารางแล้วให้ระบบตั้งค่า field นั้นให้เป็นค่าว่าง
3. No Action คือกำหนดให้ไม่ต้องทำอะไร เมื่อมีการ update หรือ delete ข้อมูลใน field ที่มีความสัมพันธ์ระหว่างตาราง ข้อมูลที่อยู่ใน field ที่เชื่อมโยงก็จะอยู่เหมือนเดิมไม่มีการเปลี่ยนแปลงแต่อย่างใด
4. Restrict คือห้ามมีมิให้มีการเปลี่ยนแปลงใน field ที่ถูกกำหนดความสัมพันธ์ทั้งแบบ on delete หรือ on update เรียกว่า lock ไว้ไม่ให้ผู้ใช้สามารถลบหรือปรับปรุงค่าต่างๆได้เลย
บทความนี้จะยกตัวอย่างในการสร้างและแก้ไข Foreign Key ด้วย phpmyadmin และแบบ mysql syntax โดยอันดับแรกจะขอยกตัวอย่างตั้งแต่การออกแบบ ER-Diagram แบบ Chen Model โดยยกตัวอย่าง 3 Entity ได้แก่ Professor, Class, Course ) er-d_chen
จากนั้นจะทดลองสร้าง ตารางตาม ER-D ข้างบน จำนวน 3 ตาราง
3tables.jpg
และกำหนด Primary Key ของแต่ละตารางตามโดยกำหนดให้ Primary Key คือตัวที่ขีดเส้นใต้ ตามหลักของการเขียน ER-D แบบ Chen ที่เราออกแบบไว้พร้อมกำหนด Primary Key ให้เรียบร้อย

จากนั้นให้เข้าไปที่ตารางที่มี Foreign Key จากรูปคือตาราง class และไปที่ Structure และไปที่ Relation view   (Go to >class Table>structure>relation view ) ดังรูป
class_structure
เมื่อกำหนดแล้วจะได้หน้าตาแบบนี้ เราก็กรอกข้อมูลรายละเอียดของ Foreign Key ให้ครบถ้วน
foreignkey_gui.jpg
โดยผมจะลองยกตัวอย่างการสร้าง Foreign Key โดยกำหนดความสัมพันธ์แบบ no action เมื่อมีการ ลบหรือ เปลี่ยนแปลง ข้อมูลใน field prof_id ที่มีความสัมพันธ์กันระหว่างตาราง class กับ professor มันจะไม่เกิดอะไรขึ้น โดยจะลองทำให้ดูทีละแบบ และกำหนดความสัมพันธ์แบบ cascade เมื่อมีการลบ หรือเปลี่ยนแปลง ความสัมพันธ์ระหว่าง field crs_id ระหว่างตาราง class กับ course ซึ่งเมื่อมีการเปลี่ยนแปลงข้อมูลใน field   ***หมายเหตุ***โดยในการตั้งค่า foreign key ควรทำตอนสร้างตารางไม่ควรทำตอนมีข้อมูลอยู่ในตาราง
nocation_cascades
MySQL Syntax ในการสร้าง Foreign Key (กรณีสร้างตารางไปแล้ว เราต้องใช้คำสั่งปรับปรุงแก้ไขตาราง นั้นก็คือคำสั่ง Alter Table จากตัวอย่างเป็นการสร้าง Constraint สองครังไม่ได้สร้างพร้อมกัน แต่ Constraint สามารถสร้างพร้อมกันได้ )
ALTER TABLE `class` ADD CONSTRAINT `abc` FOREIGN KEY (`prof_id`) REFERENCES `professor`(`prof_id`) ON DELETE NO ACTION ON UPDATE NO ACTION;
———————————————————————————————–
ALTER TABLE `class` ADD CONSTRAINT `casecades` FOREIGN KEY (`crs_id`) REFERENCES `course`(`crs_id`) ON DELETE CASCADE ON UPDATE CASCADE;
เมื่อสร้างเสร็จแล้วจะได้ดังรูป
foreignkeycomplete
จากนั้นเรามาทดลองเพิ่มข้อมูลลงไปใน ตาราง course, professor, class
insertprofesssor
insertcourse
เมื่อเรา insert ข้อมูลที่ ตาราง course และ professor เสร็จแล้ว เรามา insert ข้อมูลต่อที่ตาราง class ระบบก็จะทำการ query ข้อมูลให้เราในหน้า insert เลย โดยเราสามารถเลือกเพิ่มข้อมูลได้จาก drop down ตามรูป สี่เหลี่ยมสีแดง และสีนำเงิน (นี่คือประโยชน์ของฐานข้อมูลเชิงสัมพันธ์)
insertclass
จากนั้นเราจะมาทดลองทำการลบข้อมูลดูโดยเข้าไปที่ตาราง course และเริ่มทำการลบข้อมูล รายวิชาไปหนึ่ง record โดยระบบจะสามารถลบข้อมูลใน record นั้นได้ (เพราะเราใช้เงื่อนไข on delete cascade) และการลบข้อมูลในตาราง course จะส่งกระทบไปยัง record ในตาราง class ด้วย เพราะถูกเชื่อมโยงกันด้วย foreign key ดังรูป
ondeletecascade
ในตาราง class จะไม่ปรากฏ record ของข้อมูลที่มีการเชื่อมโยงเลย ดังรูป
norecord
และหากทดลองลบข้อมูลในตาราง professor จะไม่สามารถลบข้อมูลได้เนื่องจาก foreign key ของ field prof_id ของตาราง professor เชื่อมโยงกับ field prof_id ของตาราง class อยู่ โดยมีความสัมพันธ์เป็น no action จึงทำให้ไม่สามารถลบข้อมูลได้ดังรูป
ondelete_onaction

สรุปจากบทความนี้หวังว่าผู้อ่านคงจะได้ความรู้และวิธีการสร้าง foreign key และการตั้งค่าความสัมพันธ์ของ foreign key บ้างไม่มากก็น้อยนะครับ หากสงสัยสามารถโพสสอบถามได้นะครับ

0 ความคิดเห็น:

แสดงความคิดเห็น