ตั้งค่าคีย์ต่างประเทศใน phpMyAdmin หรือไม่


336

ฉันกำลังตั้งค่าฐานข้อมูลโดยใช้ phpMyAdmin ฉันมีสองตาราง ( fooและbar) การจัดทำดัชนีในคีย์หลักของพวกเขา ฉันพยายามสร้างตารางสัมพันธ์ ( foo_bar) ระหว่างพวกเขาโดยใช้คีย์หลักเป็นคีย์ต่างประเทศ

ฉันสร้างตารางเหล่านี้เป็น MyISAM แต่หลังจากนั้นทั้งสามเปลี่ยนเป็น InnoDB เนื่องจากฉันอ่านว่า MyISAM ไม่สนับสนุนคีย์ต่างประเทศ ทุกเขตข้อมูลidINT(11)

เมื่อฉันเลือกfoo_barตารางให้คลิกลิงก์ "มุมมองที่เกี่ยวข้อง" และพยายามตั้งค่าคอลัมน์ FK ให้เป็นdatabase.foo.idและจะมีdatabase.bar.idข้อความระบุว่า"ไม่ได้กำหนดดัชนี!" ข้างแต่ละคอลัมน์

ฉันพลาดอะไรไป

ชี้แจง / อัปเดต

เพื่อความเรียบง่ายฉันต้องการใช้ phpMyAdmin ต่อไป ฉันกำลังใช้ XAMPP ซึ่งเป็นเรื่องง่ายพอที่จะให้ฉันจดจ่อกับ PHP / CSS / Javascript และมันมาพร้อมกับ phpMyAdmin

นอกจากนี้แม้ว่าฉันจะไม่สามารถตั้งค่าคีย์ต่างประเทศที่ชัดเจนได้ แต่ฉันมีตารางสัมพันธ์และสามารถรวมเข้าด้วยกันเช่นนี้:

SELECT * 
FROM foo 
INNER JOIN foo_bar 
ON foo.id = foo_bar.foo_id 
INNER JOIN bar
ON foo_bar.bar_id = bar.id;

มันทำให้ฉันรู้สึกไม่สบายใจที่จะไม่ได้กำหนด FK ไว้อย่างชัดเจนในฐานข้อมูล

คำตอบ:


366

ถ้าคุณต้องการใช้ phpMyAdmin เพื่อตั้งค่าความสัมพันธ์คุณต้องทำ 2 สิ่ง ก่อนอื่นคุณต้องกำหนดดัชนีในคอลัมน์ foreign key ในตารางอ้างอิง (ดังนั้น foo_bar.foo_id ในกรณีของคุณ) จากนั้นไปที่มุมมองความสัมพันธ์ (ในตารางอ้างอิง) และเลือกคอลัมน์ที่อ้างอิง (ดังนั้นในกรณีของคุณ foo.id) และการดำเนินการอัพเดตและการลบ

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

แก้ไข: ตรวจสอบให้แน่ใจว่าทั้งสองตารางมีเครื่องมือ InnoDB ที่เลือก


93
เคล็ดลับ: มุมมองความสัมพันธ์เป็นลิงก์เล็ก ๆ ใต้โต๊ะของคุณมันเป็นเรื่องยากสำหรับฉันที่จะพบมันในตอนแรก
Mladen Janjetovic

14
เว้นแต่ลิงค์นั้นจะไม่ปรากฏที่นั่นในกรณีนี้: ตรวจสอบให้แน่ใจว่าตารางของคุณเป็นประเภท InnoDB (ภายใต้แท็บการดำเนินการใน phpMyAdmin) เพื่อให้สิ่งนี้ไม่เกิดขึ้น
muttley91

4
@ muttley91 ตารางของฉันคือ InnoDB ฉันตรวจสอบอีกครั้ง ลิงก์ยังไม่ปรากฏขึ้น
afilina

6
@afilina ใน phpMyAdmin เวอร์ชันใหม่จะปรากฏที่ด้านบนภายในแท็บ "โครงสร้าง" ด้านล่างแถวแท็บที่แสดง "เรียกดู", "โครงสร้าง" ฯลฯ
Astitva Srivastava

226

phpMyAdmin ให้คุณกำหนดคีย์ต่างประเทศโดยใช้มุมมอง "ความสัมพันธ์" แต่เนื่องจาก MySQL สนับสนุนข้อ จำกัด ต่างประเทศในตาราง "INNO DB" เท่านั้นขั้นตอนแรกคือตรวจสอบให้แน่ใจว่าตารางที่คุณใช้นั้นเป็นประเภทนั้น

ในการตั้งค่า foreign key เพื่อให้คอลัมน์ PID ในตารางชื่อ CHILD อ้างอิงคอลัมน์ ID ในตารางชื่อ PARENT คุณสามารถทำสิ่งต่อไปนี้:

  1. สำหรับทั้งสองตารางให้ไปที่แท็บการดำเนินการและเปลี่ยนประเภทเป็น "INNO DB"
  2. ตรวจสอบให้แน่ใจว่า ID เป็นคีย์หลัก (หรืออย่างน้อยคอลัมน์ที่จัดทำดัชนี) ของตาราง PARENT
  3. ในตาราง CHILD กำหนดดัชนีสำหรับคอลัมน์ PID
  4. ขณะดูแท็บโครงสร้างของตารางเด็กคลิกลิงก์ "มุมมองที่เกี่ยวข้อง" ด้านบนส่วน "เพิ่มเขตข้อมูล"
  5. คุณจะได้รับตารางที่แต่ละแถวสอดคล้องกับคอลัมน์ที่จัดทำดัชนีในตารางลูกค้าของคุณ ดร็อปดาวน์แรกในแต่ละแถวช่วยให้คุณสามารถเลือก Table-> COLUMN สำหรับการอ้างอิงคอลัมน์ที่ทำดัชนี ในแถว PID ให้เลือก PARENT-> ID จากดรอปดาวน์และคลิกไป

เมื่อทำการส่งออกบนตาราง CHILD คุณควรเห็นข้อ จำกัด foreign key ถูกสร้างขึ้นสำหรับคอลัมน์ PID


2
ว้าวสิ่งสำคัญที่ต้องรู้ หน้านี้ไม่ใช่สิ่งแรกที่ฉันพบเมื่อมองหาความช่วยเหลือเกี่ยวกับการเพิ่มคีย์ต่างประเทศฉันหวังว่าสิ่งนี้ถูกกล่าวถึงบ่อยครั้ง
user1299656

87

นี่คือบทสรุปของบทความ Wikipedia มันระบุประเภทของความสัมพันธ์ที่คุณสามารถกำหนดใน PHPmyadmin ฉันใส่ที่นี่เพราะเกี่ยวข้องกับความคิดเห็นของ @ Nathan เกี่ยวกับการตั้งค่าตัวเลือกคีย์ต่างประเทศสำหรับ "ในการอัปเดต / ลบ" แต่ใหญ่เกินไปสำหรับความคิดเห็น - หวังว่ามันจะช่วยได้

น้ำตก

เมื่อใดก็ตามที่แถวในตารางต้นแบบ (อ้างอิง) ถูกลบ (ปรับปรุงการตอบรับ) แถวที่เกี่ยวข้องของตารางลูก (อ้างอิง) ที่มีคอลัมน์คีย์ต่างประเทศที่ตรงกันจะถูกลบ (การปรับปรุง) ด้วยเช่นกัน สิ่งนี้เรียกว่าการลบแบบเรียงซ้อน (resp. update [2])

จำกัด

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

ไม่มีการตอบสนอง

ไม่มีการกระทำและการ จำกัด เหมือนกันมาก ความแตกต่างที่สำคัญระหว่าง NO ACTION และ RESTRICT ก็คือถ้าไม่มี ACTION การตรวจสอบ Referential Integrity นั้นจะทำหลังจากพยายามปรับเปลี่ยนตาราง RESTRICT ทำการตรวจสอบก่อนที่จะพยายามดำเนินการคำสั่ง UPDATE หรือ DELETE การดำเนินการอ้างอิงทั้งสองกระทำเหมือนกันถ้าการตรวจสอบความสมบูรณ์ของการอ้างอิงล้มเหลว: คำสั่ง UPDATE หรือ DELETE จะส่งผลให้เกิดข้อผิดพลาด

ตั้งค่าเป็นศูนย์

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

ตั้งค่าเริ่มต้น

เช่นเดียวกับ SET NULL ค่า foreign key ในแถวอ้างอิงจะถูกตั้งค่าเป็นคอลัมน์เริ่มต้นเมื่อแถวอ้างอิงถูกปรับปรุงหรือลบ


1
ยังดีกว่าไปที่เอกสารแหล่งข้อมูล MySQL โดยตรง: dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html
kmoser

63

ใน phpmyadmin คุณสามารถกำหนดรหัสต่างประเทศได้ง่ายๆผ่าน GUI คลิกที่ตารางและไปที่แท็บโครงสร้าง ค้นหามุมมองความสัมพันธ์ในตารางด้านล่าง (แสดงในภาพด้านล่าง)

ป้อนคำอธิบายรูปภาพที่นี่

คุณสามารถกำหนดคีย์ปลอมจากกล่องรายการใกล้กับคีย์หลัก (ดูภาพด้านล่าง) และบันทึก

ป้อนคำอธิบายรูปภาพที่นี่

แบบสอบถาม SQL ที่สอดคล้องกันจะถูกสร้างและดำเนินการโดยอัตโนมัติ


17

สำหรับผู้ใช้ใหม่ในฐานข้อมูล .... และจำเป็นต้องแก้ไขตารางที่มีอยู่ ดูเหมือนจะตรงไปตรงมา แต่มีบางสิ่งเสมอ ... ระหว่าง A กับ B

ก่อนสิ่งอื่นจะดูที่นี้

  1. ตรวจสอบให้แน่ใจว่าคุณมี P_ID (ID ผู้ปกครองบนทั้งตารางหลักและตารางย่อย)
  2. แน่นอนว่ามันจะถูกกรอกไว้ในแม่แล้ว ไม่จำเป็นต้องเป็นเด็กในวิธีที่เป็นจริงและสุดท้าย ดังนั้นเช่น P_ID # 3 (อาจจะหลายครั้งในตารางลูกจะชี้ไปที่ P_ID ดั้งเดิมที่ตารางหลัก)
  3. ไปที่แท็บ SQL (ฉันใช้ phpMyAdmin, ควรเหมือนกันในรายการอื่น) และทำตามคำสั่งนี้:

    ALTER TABLE child_table_name    
    ADD FOREIGN KEY (P_ID)   
    REFERENCES parent_table_name (P_ID)
  4. คลิกที่ตารางลูกกว่าโครงสร้างในที่สุดในมุมมองเชิงสัมพันธ์ เสร็จสิ้นการวางแผนฐานข้อมูลของคุณที่นั่น มีคำตอบที่ดีก่อนหน้านี้เกี่ยวกับน้ำตก จำกัด และแน่นอนมันสามารถทำได้โดยคำสั่ง ...


9

Foreign key หมายถึงแอ็ตทริบิวต์ non prime ของตารางอ้างถึงคุณลักษณะ prime ของอีก *ใน phpMyAdmin * ก่อนกำหนดคอลัมน์ที่คุณต้องการตั้ง foreign key เป็นดัชนี

จากนั้นคลิกที่ความสัมพันธ์ดู

คุณสามารถหาตัวเลือกเพื่อตั้งค่า foreign key ได้


7

InnoDB อนุญาตให้คุณเพิ่มข้อ จำกัด foreign key ใหม่ในตารางโดยใช้ ALTER TABLE:

ALTER TABLE tbl_name
    ADD [CONSTRAINT [symbol]] FOREIGN KEY
    [index_name] (index_col_name, ...)
    REFERENCES tbl_name (index_col_name,...)
    [ON DELETE reference_option]
    [ON UPDATE reference_option]

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


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

1
@ นาธาน: นั่นคือสิ่งที่ฉันพูดในโพสต์ คุณสามารถจัดการกับมันในระดับของโมเดลได้เช่นกัน คุณสามารถนำไปใช้ในการลบน้ำตกจากรูปแบบ
markus

3
คุณเพิ่ม referential integrity ในตารางฐานข้อมูลของคุณเกือบตลอดเวลา ฐานข้อมูลควรป้องกันตนเองจากการเขียนโปรแกรมประยุกต์ที่ไม่ดี อย่าพึ่งพาแอปพลิเคชันของคุณเพียงอย่างเดียวเพื่อรักษาความถูกต้องของข้อมูล แน่นอนมีข้อยกเว้นสำหรับทุกกฎอยู่เสมอ แต่ฉันไม่พบข้อนี้
Harv

4

อย่าลืมว่าทั้งสองคอลัมน์ควรมีประเภทข้อมูลเดียวกัน

ตัวอย่างเช่นหากหนึ่งคอลัมน์เป็นประเภท INT และอีกคอลัมน์เป็นประเภทจิ๋วคุณจะได้รับข้อผิดพลาดดังต่อไปนี้:

เกิดข้อผิดพลาดในการสร้างคีย์ต่างประเทศใน [คอลัมน์ PID] (ตรวจสอบประเภทข้อมูล)


3

ขั้นตอนที่ 1: คุณต้องเพิ่มบรรทัด: default-storage-engine = InnoDB ภายใต้ส่วน [mysqld] ของไฟล์กำหนดค่า mysql (my.cnf หรือ my.ini ขึ้นอยู่กับระบบปฏิบัติการของคุณ) และเริ่มบริการ mysqld ใหม่ ป้อนคำอธิบายรูปภาพที่นี่

ขั้นตอนที่ 2: ตอนนี้เมื่อคุณสร้างตารางคุณจะเห็นประเภทของตารางคือ: InnoDB

ป้อนคำอธิบายรูปภาพที่นี่

ขั้นตอนที่ 3: สร้างทั้งตารางหลักและตารางย่อย ตอนนี้เปิดตารางย่อยแล้วเลือกคอลัมน์ U ที่ต้องการมี Foreign Key: เลือกคีย์ดัชนีจาก Label Action ดังที่แสดงด้านล่าง

ป้อนคำอธิบายรูปภาพที่นี่

ขั้นตอนที่ 4: ตอนนี้เปิดมุมมองความสัมพันธ์ในตารางลูกเดียวกันจากด้านล่างใกล้กับมุมมองพิมพ์ที่แสดงด้านล่าง

ป้อนคำอธิบายรูปภาพที่นี่ ขั้นตอนที่ 5: เลือกคอลัมน์ U ที่ต้องการให้มี Foreign key เป็น Select the Parent คอลัมน์จากดรอปดาวน์ dbName.TableName.ColumnName

เลือกค่าที่เหมาะสมสำหรับ ON DELETE และ ON UPDATE ป้อนคำอธิบายรูปภาพที่นี่


2

ตั้งค่า Storage Engine เป็นInnoDB ก่อน

ตั้งค่า Storage Engine เป็น InnoDB ก่อน

จากนั้นตัวเลือกมุมมองความสัมพันธ์จะเปิดใช้งานในเมนูโครงสร้าง

จากนั้นตัวเลือกมุมมองความสัมพันธ์จะเปิดใช้งาน


ขั้นตอนแรกของคุณถูกต้อง แต่สิ่งที่เกี่ยวกับถัดไปโปรดเขียนขั้นตอนกระบวนการทั้งหมดโดยขั้นตอน
kunal shaktawat

2

นี่คือกระทู้เก่า แต่ตอบเพราะถ้าเป็นประโยชน์กับทุกคน

ขั้นตอนที่ 1 Db Storage Engine ของคุณถูกตั้งค่าเป็นInnoDB

ขั้นตอนที่ 22 สร้างตารางหลัก

นี่customerคือตารางหลักและcustomer_idเป็นคีย์หลัก

ป้อนคำอธิบายรูปภาพที่นี่

ขั้นตอนที่ 33 สร้างตารางคีย์ต่างประเทศและให้ดัชนี

ที่นี่เรามีcustomer_addressesตารางที่เกี่ยวข้องและจัดเก็บที่อยู่ลูกค้าดังนั้นที่นี่customer_idมีความสัมพันธ์กับcustomerตาราง

เราสามารถเลือกดัชนีได้โดยตรงเมื่อสร้างตารางดังนี้

ป้อนคำอธิบายรูปภาพที่นี่

หากคุณลืมที่จะให้ดัชนีเมื่อสร้างตารางคุณสามารถให้ดัชนีจากแท็บโครงสร้างของตารางด้านล่าง

ป้อนคำอธิบายรูปภาพที่นี่

ขั้นตอนที่ 4 เมื่อดัชนีมอบให้กับสนามไปที่แท็บโครงสร้างและคลิกที่มุมมองความสัมพันธ์ดังแสดงในรูปด้านล่าง

ป้อนคำอธิบายรูปภาพที่นี่

ขั้นตอนที่ 5 ตอนนี้เลือก ON DELETE และ UPDATE ON สิ่งที่คุณต้องการจะทำเลือกคอลัมน์จากตารางปัจจุบันให้เลือก DB (DB เดียวกัน) เลือกตารางความสัมพันธ์และคีย์หลักจากตารางที่ดังแสดงในรูปด้านล่างและบันทึกมัน

ป้อนคำอธิบายรูปภาพที่นี่

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


0

จากเอกสาร MySQL อย่างเป็นทางการที่https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html :

MySQL ต้องการดัชนีในคีย์ต่างประเทศและรหัสอ้างอิงเพื่อให้การตรวจสอบคีย์ต่างประเทศนั้นรวดเร็วและไม่ต้องใช้การสแกนตาราง


0

รุ่นที่ใหม่กว่าของ phpMyAdmin ไม่มีตัวเลือก " มุมมองความสัมพันธ์ " อีกต่อไปซึ่งในกรณีนี้คุณจะต้องดำเนินการคำสั่งเพื่อให้ได้สิ่งเดียวกัน ตัวอย่างเช่น

ALTER TABLE employees
    ADD CONSTRAINT fk_companyid FOREIGN KEY (companyid)
    REFERENCES companies (id)
    ON DELETE CASCADE;

ในตัวอย่างนี้ถ้าลบแถวจาก บริษัท พนักงานทั้งหมดที่มี companyid นั้นจะถูกลบด้วย

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