كيف أرى جميع المفاتيح الخارجية لجدول أو عمود؟

في MySQL ، كيف يمكنني الحصول على قائمة بكل قيود المفتاح الخارجي التي تشير إلى جدول معين؟ عمود معين؟ هذا هو نفس الشيء مثل سؤال Oracle هذا ، ولكن لـ MySQL.

413

11 إجابة

لجدول:

SELECT 
  TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME
FROM
  INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
  REFERENCED_TABLE_SCHEMA = '' AND
  REFERENCED_TABLE_NAME = '<table>';

For a Column:

SELECT 
  TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME
FROM
  INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
  REFERENCED_TABLE_SCHEMA = '' AND
  REFERENCED_COLUMN_NAME = '';

Basically, we changed REFERENCED_TABLE_NAME with REFERENCED_COLUMN_NAME in the where clause.

569
وأضاف
Acute: هل أنت متأكد من أنك تسأل عن الجدول الصحيح؟ إذا عمل استعلام العقدة ، فأنت تسأل على الأرجح عن الاتجاه الآخر (أي مفاتيح FROM mytable ، وليس مفاتيح TO mytable.) هذا متوقع أنك كتبت '<table>' مع اسم الجدول وبدون '<' و '>' ؟
وأضاف المؤلف Vinko Vrsalovic, مصدر
لماذا هو مطلوب كثيرا؟ لماذا لا تجعل الأمر سهلاً مثل كيفية تحديد الصفوف؟
وأضاف المؤلف Lealo, مصدر
متفق عليه ، أنا فقط حصلت على مجموعة فارغة هنا! جواب آندي كان أفضل بالنسبة لي.
وأضاف المؤلف omarjebari, مصدر
DeepakRam هذا يعمل بشكل مثالي بالنسبة لي مع مستخدم متميز ليس المستخدم الجذر.
وأضاف المؤلف Matthew Read, مصدر
هذا عمل مثالي بالنسبة لي. لدي معظم الامتيازات ، ولكن ليس الجذر. كنت منقذا للحياة.
وأضاف المؤلف jDub9, مصدر
هذا يعطيني دائما مجموعة فارغة ، في حين أن الاستعلام المقترح من قبل عقدة أدناه يعمل بشكل جيد
وأضاف المؤلف Acute, مصدر
يبدو أنني أساءت فهمك للاستعلام ، لأنني كنت أستفسر عن مفاتيح الرجوع من <table> :) (نعم ، كتبت اسم الجدول بدلاً من "<table>" XD)
وأضاف المؤلف Acute, مصدر
ما لم تكن متأكدًا من أن اسم الجدول الخاص بك فريد من نوعه ، فستحتاج على الأرجح إلى تقييد استعلامك على قاعدة بيانات معينة أيضًا. غيّر عبارة المكان إلى هذا: حيث REFERENCED_TABLE_SCHEMA = 'mydatabase' و REFERENCED_TABLE_NAME = 'mytable'
وأضاف المؤلف user12345, مصدر
هذا متعود يعمل في حالة المستخدم غير الجذر على الرغم من أن المستخدم لديه كافة الأذونات إلى قاعدة البيانات
وأضاف المؤلف Deepak Ram, مصدر

تحرير: كما هو موضح في التعليقات ، هذه ليست الإجابة الصحيحة لسؤال OP ، ولكن من المفيد معرفة هذا الأمر. ظهر هذا السؤال في Google عما كنت أبحث عنه ، وحسبت أنني سأترك هذه الإجابة ليجدها الآخرون.

SHOW CREATE TABLE ``;

I found this answer here: MySQL : show constraints on tables command

كنت بحاجة إلى هذه الطريقة لأنني أردت أن أرى كيف تعمل FK ، بدلاً من رؤية ما إذا كانت موجودة أم لا.

194
وأضاف
كما يقولararmar ، هذا خطأ كامل ؛ ستظهر المفاتيح الخارجية التي تنتمي إلى الجدول المحدد ، ولكن لن تظهر المفاتيح الخارجية التي تشير إلى TO الجدول ، وهو ما يطلبه السؤال. لا فكرة كيف حصل هذا 50 upvotes؛ أعتقد أن الناس انتهى بهم المطاف عندما كانوا يبحثون بالفعل عن الإجابة على السؤال المعاكس ، وجدوا جوابهم هنا على أي حال ، ولم يكلفوا عناء قراءة السؤال الأصلي (أو حتى عنوانه) قبل التصويت.
وأضاف المؤلف Mark Amery, مصدر
يعرض هذا جميع القيود في ، وليس كل القيود التي تشير إلى .
وأضاف المؤلف Barmar, مصدر
هذا في الواقع يظهر جميع القيود الموجودة ، وسوف تظهر لك فقط phpmyadmin واحد يشير إلى الجدول الخاص بك. يبدو جيدًا بما فيه الكفاية لتجنب التكرار باستخدام أداة ORM
وأضاف المؤلف william.eyidi, مصدر
MarkAmery: هذه أول نتيجة لـ عرض مفاتيح خارجية MySQL في Google ، قد يكون هذا هو السبب ؛)
وأضاف المؤلف Jigar, مصدر
هذا ما كنت أبحث عنه ، لذا نشكرك على نشره على الرغم من عدم إجابته على سؤال OP. لا تؤلم أن تعرف كيف تنظر في كلا الاتجاهين في العلاقة!
وأضاف المؤلف Charles Wood, مصدر

إذا كنت تستخدم InnoDB وحددت FK يمكنك الاستعلام عن database_schema database على سبيل المثال:

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';
58
وأضاف
في الواقع ، هذا يشير إلى الاتجاه الخاطئ. يظهر هذا الاستعلام جميع المفاتيح الخارجية التي تشير من 'mytable' ، وليس كل المفاتيح الخارجية التي تشير إلى 'mytable'.
وأضاف المؤلف Christian Oudard, مصدر
يمكنك الحصول على المفاتيح الخارجية في كلا الاتجاهين من جدول REFERENTIAL_CONSTRAINTS - لقد أضفت إجابة أخرى باستخدام الاستعلام.
وأضاف المؤلف ChrisV, مصدر
هذا واحد يعمل بشكل أفضل في حالتي. ولست بحاجة لإسقاط كل قيد مفتاح خارجي (فقط تلك) من جدول لتتمكن من تغيير محرك InnoDB MyISAM أو NDB.
وأضاف المؤلف Kohányi Róbert, مصدر

نشر على إجابة قديمة لإضافة بعض المعلومات المفيدة.

كان لدي مشكلة مشابهة ولكن أريد أيضاً رؤية CONSTRAINT_TYPE مع أسماء الجدول والأعمدة REFERENCED. وبالتالي،

  1. To see all FKs in your table:

    USE '';
    
    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 = '';
    
  2. To see all the tables and FKs in your schema:

    USE '';
    
    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();
    
  3. To see all the FKs in your database:

    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 = '';

لإصلاح ، استخدم هذا:

ALTER TABLE `` ENGINE=InnoDB;
32
وأضاف
لا يدعم MyISAM المفاتيح الخارجية ، للأسف. dev.mysql.com/doc/refman/5.7/ EN/MYISAM-التخزين engine.html
وأضاف المؤلف Andy, مصدر
إجابة رائعة. هل لديك أي حلول ل MyISAM؟
وأضاف المؤلف Beau Bouchard, مصدر
تعمل تلك الاستعلامات بشكل أسرع (من 2 ثانية إلى 0.0015 ثانية) إذا قمت بتحديد k.TABLE_SCHEMA = DATABASE() و k.TABLE_NAME = '<table>' في جملة WHERE ، كما هو موثق هنا dev.mysql.com/doc/refman/5.5/en/&hellip؛
وأضاف المؤلف guigouz, مصدر

كبديل لجواب Node ، إذا كنت تستخدم InnoDB وحددت FK يمكنك الاستعلام عن database_schema database على سبيل المثال:

SELECT CONSTRAINT_NAME, TABLE_NAME, REFERENCED_TABLE_NAME
FROM information_schema.REFERENTIAL_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = ''
AND TABLE_NAME = '<table>'

for foreign keys from <table>, or

SELECT CONSTRAINT_NAME, TABLE_NAME, REFERENCED_TABLE_NAME
FROM information_schema.REFERENTIAL_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = ''
AND REFERENCED_TABLE_NAME = '<table>'

for foreign keys to <table>

You can also get the UPDATE_RULE and DELETE_RULE if you want them.

17
وأضاف
أنا شخصيا أفضل هذه الإجابة باستخدام جدول REFERENTIAL_CONSTRAINTS يمنحك قاعدة التحديث والتتالي. +1
وأضاف المؤلف Luke Madhanga, مصدر
القيام باكتشاف عن طاولة لا ينبغي أن ننسى أنه يمكن إنشاء مفاتيح خارجية كلا الطريقتين!
وأضاف المؤلف Encoder, مصدر

لن يعرض هذا الحل جميع العلاقات فحسب ولكن أيضًا اسم القيد المطلوب في بعض الحالات (على سبيل المثال ، منع السقوط):

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

في نهاية الاستعلام.

Inspired by this post here

7
وأضاف

طريقة سريعة لإدراج FKs الخاص بك (مراجع المفتاح الخارجي) باستخدام

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 الرسمي.

2
وأضاف

To find all tables containing a particular foreign key such as employee_id

SELECT DISTINCT TABLE_NAME 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME IN ('employee_id')
AND TABLE_SCHEMA='table_name';
2
وأضاف

الحل الذي توصلت إليه هو هش. وهو يعتمد على تسمية تسمية 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
1
وأضاف

لا يعمل استخدام REFERENCED_TABLE_NAME دائمًا ويمكن أن يكون قيمة NULL. يمكن أن يعمل الاستعلام التالي بدلاً من ذلك:

select * from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where TABLE_NAME = '<table>';
1
وأضاف

إذا كنت تريد أيضًا الحصول على اسم عمود المفتاح الخارجي:

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;
0
وأضاف