ใน MySQL ฉันจะรับรายการข้อ จำกัด คีย์ต่างประเทศทั้งหมดที่ชี้ไปยังตารางที่ระบุได้อย่างไร คอลัมน์ใดคอลัมน์หนึ่ง นี่คือสิ่งเดียวกันกับคำถาม Oracle นี้แต่สำหรับ MySQL
ใน MySQL ฉันจะรับรายการข้อ จำกัด คีย์ต่างประเทศทั้งหมดที่ชี้ไปยังตารางที่ระบุได้อย่างไร คอลัมน์ใดคอลัมน์หนึ่ง นี่คือสิ่งเดียวกันกับคำถาม Oracle นี้แต่สำหรับ MySQL
คำตอบ:
สำหรับตาราง:
SELECT
TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME
FROM
INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
REFERENCED_TABLE_SCHEMA = '<database>' AND
REFERENCED_TABLE_NAME = '<table>';
สำหรับคอลัมน์:
SELECT
TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME
FROM
INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
REFERENCED_TABLE_SCHEMA = '<database>' AND
REFERENCED_TABLE_NAME = '<table>' AND
REFERENCED_COLUMN_NAME = '<column>';
โดยพื้นฐานแล้วเราเปลี่ยน REFERENCED_TABLE_NAME ด้วย REFERENCED_COLUMN_NAME ในส่วนคำสั่ง
where REFERENCED_TABLE_SCHEMA = 'mydatabase' and REFERENCED_TABLE_NAME = 'mytable'
แก้ไข: ตามที่ระบุไว้ในความคิดเห็นนี้ไม่ใช่คำตอบที่ถูกต้องสำหรับคำถาม OPs แต่มันมีประโยชน์ที่จะรู้คำสั่งนี้ คำถามนี้ปรากฏใน Google สำหรับสิ่งที่ฉันกำลังมองหาและคิดว่าฉันจะทิ้งคำตอบนี้เพื่อให้คนอื่นหา
SHOW CREATE TABLE `<yourtable>`;
ฉันพบคำตอบนี้ที่นี่: MySQL: แสดงข้อ จำกัด ในคำสั่ง tables
ฉันต้องการวิธีนี้เพราะฉันต้องการดูว่า FK ทำงานอย่างไรแทนที่จะดูว่ามันมีอยู่จริงหรือไม่
<yourtable>
ไม่ได้ทุกข้อ จำกัด <yourtable>
ที่ชี้ไปที่
display foreign keys mysql
ใน Google, อาจเป็นได้ว่าเป็นเหตุผลที่;)
หากคุณใช้ InnoDB และกำหนด FK คุณสามารถสืบค้นฐานข้อมูล information_schema เช่น:
SELECT * FROM information_schema.TABLE_CONSTRAINTS
WHERE information_schema.TABLE_CONSTRAINTS.CONSTRAINT_TYPE = 'FOREIGN KEY'
AND information_schema.TABLE_CONSTRAINTS.TABLE_SCHEMA = 'myschema'
AND information_schema.TABLE_CONSTRAINTS.TABLE_NAME = 'mytable';
โพสต์คำตอบเก่าเพื่อเพิ่มข้อมูลที่เป็นประโยชน์
ฉันมีปัญหาที่คล้ายกัน แต่ฉันต้องการเห็น CONSTRAINT_TYPE พร้อมกับชื่อตารางและคอลัมน์ที่อ้างอิง ดังนั้น,
หากต้องการดู FK ทั้งหมดในตารางของคุณ:
USE '<yourschema>';
SELECT i.TABLE_NAME, i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME
FROM information_schema.TABLE_CONSTRAINTS i
LEFT JOIN information_schema.KEY_COLUMN_USAGE k ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME
WHERE i.CONSTRAINT_TYPE = 'FOREIGN KEY'
AND i.TABLE_SCHEMA = DATABASE()
AND i.TABLE_NAME = '<yourtable>';
หากต้องการดูตารางและ FK ทั้งหมดในสคีมาของคุณ:
USE '<yourschema>';
SELECT i.TABLE_NAME, i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME
FROM information_schema.TABLE_CONSTRAINTS i
LEFT JOIN information_schema.KEY_COLUMN_USAGE k ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME
WHERE i.CONSTRAINT_TYPE = 'FOREIGN KEY'
AND i.TABLE_SCHEMA = DATABASE();
ในการดู FK ทั้งหมดในฐานข้อมูลของคุณ:
SELECT i.TABLE_SCHEMA, i.TABLE_NAME, i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME
FROM information_schema.TABLE_CONSTRAINTS i
LEFT JOIN information_schema.KEY_COLUMN_USAGE k ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME
WHERE i.CONSTRAINT_TYPE = 'FOREIGN KEY';
จำไว้!
นี่คือการใช้เครื่องมือจัดเก็บข้อมูล InnoDB หากคุณไม่สามารถรับคีย์ต่างประเทศใด ๆ ที่จะแสดงหลังจากเพิ่มพวกเขาอาจเป็นเพราะตารางของคุณใช้ MyISAM
เพื่อตรวจสอบ:
SELECT * TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA = '<yourschema>';
ในการแก้ไขให้ใช้สิ่งนี้:
ALTER TABLE `<yourtable>` ENGINE=InnoDB;
เป็นทางเลือกแทนคำตอบของ Node ถ้าคุณใช้ InnoDB และ FK ที่กำหนดไว้คุณสามารถสืบค้นฐานข้อมูล information_schema เช่น:
SELECT CONSTRAINT_NAME, TABLE_NAME, REFERENCED_TABLE_NAME
FROM information_schema.REFERENTIAL_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = '<schema>'
AND TABLE_NAME = '<table>'
สำหรับคีย์ต่างประเทศจาก <table> หรือ
SELECT CONSTRAINT_NAME, TABLE_NAME, REFERENCED_TABLE_NAME
FROM information_schema.REFERENTIAL_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = '<schema>'
AND REFERENCED_TABLE_NAME = '<table>'
สำหรับ foreign key ไปที่ <table>
คุณสามารถรับ UPDATE_RULE และ DELETE_RULE ได้หากต้องการ
โซลูชันนี้จะไม่เพียงแสดงความสัมพันธ์ทั้งหมด แต่ยังรวมถึงชื่อข้อ จำกัด ซึ่งจำเป็นในบางกรณี (เช่นข้อ จำกัด การวาง):
select
concat(table_name, '.', column_name) as 'foreign key',
concat(referenced_table_name, '.', referenced_column_name) as 'references',
constraint_name as 'constraint name'
from
information_schema.key_column_usage
where
referenced_table_name is not null;
ถ้าคุณต้องการตรวจสอบตารางในฐานข้อมูลเฉพาะตอนท้ายของคิวรีให้เพิ่มชื่อสกีมา:
select
concat(table_name, '.', column_name) as 'foreign key',
concat(referenced_table_name, '.', referenced_column_name) as 'references',
constraint_name as 'constraint name'
from
information_schema.key_column_usage
where
referenced_table_name is not null
and table_schema = 'database_name';
ในทำนองเดียวกันสำหรับชื่อคอลัมน์ที่ระบุให้เพิ่ม
และ table_name = 'table_name
ที่ท้ายแบบสอบถาม
แรงบันดาลใจจากโพสต์นี้ที่นี่
การใช้ REFERENCED_TABLE_NAME อาจไม่ทำงานและอาจเป็นค่า NULL เสมอ แบบสอบถามต่อไปนี้สามารถทำงานได้แทน:
select * from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where TABLE_NAME = '<table>';
วิธีที่รวดเร็วในการแสดงรายการ FK ของคุณ (การอ้างอิงคีย์ต่างประเทศ) โดยใช้
KEY_COLUMN_USAGE view:
SELECT CONCAT( table_name, '.',
column_name, ' -> ',
referenced_table_name, '.',
referenced_column_name ) AS list_of_fks
FROM information_schema.KEY_COLUMN_USAGE
WHERE REFERENCED_TABLE_SCHEMA = (your schema name here)
AND REFERENCED_TABLE_NAME is not null
ORDER BY TABLE_NAME, COLUMN_NAME;
แบบสอบถามนี้จะถือว่าข้อ จำกัด และตารางอ้างอิงและตารางอ้างอิงทั้งหมดอยู่ในสคีมาเดียวกัน
เพิ่มความคิดเห็นของคุณเอง
ที่มา: คู่มือ mysql อย่างเป็นทางการ
วิธีการแก้ปัญหาที่ฉันพบคือเปราะบาง มันขึ้นอยู่กับแบบแผนการตั้งชื่อของ django สำหรับกุญแจต่างประเทศ
USE information_schema;
tee mysql_output
SELECT * FROM TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'FOREIGN KEY' AND TABLE_SCHEMA = 'database_name';
notee
จากนั้นในเปลือก
grep 'refs_tablename_id' mysql_output
หากต้องการค้นหาตารางทั้งหมดที่มีรหัสต่างประเทศเฉพาะเช่นemployee_id
SELECT DISTINCT TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME IN ('employee_id')
AND TABLE_SCHEMA='table_name';
หากคุณต้องการรับชื่อคอลัมน์ต่างประเทศด้วย:
SELECT i.TABLE_SCHEMA, i.TABLE_NAME,
i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME,
k.COLUMN_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME
FROM information_schema.TABLE_CONSTRAINTS i
LEFT JOIN information_schema.KEY_COLUMN_USAGE k
ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME
WHERE i.TABLE_SCHEMA = '<TABLE_NAME>' AND i.CONSTRAINT_TYPE = 'FOREIGN KEY'
ORDER BY i.TABLE_NAME;