الخلية:كيفية تحديد العلاقات الرئيسية الخارجية برمجيا؟
-
07-07-2019 - |
سؤال
مشابه ل هذا السؤال ولكن بالنسبة لـ MySQL ....
كيف يمكنني تحديد مراجع المفاتيح الخارجية برمجياً في MySQL (بافتراض InnoDB)؟يمكنني الحصول عليها تقريبًا مع:
SHOW TABLE STATUS WHERE Name = 'MyTableName';
...ولكن للأسف، يتم اقتطاع عمود التعليق الذي يبدو أنه يحتوي على بعض هذه المعلومات، لذا لا يمكنني الاعتماد عليه.لا بد أن هناك طريقة أخرى..
سأكون سعيدًا باستدعاء C API، أو عبارة SQL، أو أي شيء - أنا فقط بحاجة إلى شيء يعمل باستمرار.
ملحوظة:لقد فكرت أيضًا في تحليل نتائج عبارة "إظهار إنشاء جدول MyTableName"، لكنني آمل حقًا أن يكون هناك شيء أبسط.
المحلول
هناك جدولان يمكنك الاستعلام عنهما للحصول على هذه المعلومات: INFORMATION_SCHEMA.TABLE_CONSTRAINTS
و INFORMATION_SCHEMA.KEY_COLUMN_USAGE
.
إليك استعلام من التعليقات الموجودة على الصفحة الأخيرة المرتبطة أعلاه، والذي يوضح كيفية الحصول على المعلومات التي تبحث عنها.
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 = 'test'
AND referenced_table_name IS NOT NULL
ORDER BY table_name, column_name;
استخدم اسم المخطط الخاص بك بدلاً من "test
' فوق.
نصائح أخرى
وهنا كان لديك أي تحسن يذكر على حلbill:
SELECT CONSTRAINT_SCHEMA AS db,
CONCAT (
TABLE_NAME,
'.',
COLUMN_NAME,
' -> ',
REFERENCED_TABLE_NAME,
'.',
REFERENCED_COLUMN_NAME
) AS relationship
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE REFERENCED_TABLE_NAME = 'your_table_name'
ORDER BY CONSTRAINT_SCHEMA,
TABLE_NAME,
COLUMN_NAME;
في هذه الحالة كنت تصفية من العلاقات مع الحقول "your_table_name" ورؤية من قاعدة البيانات التي تأتي العلاقة.
وحاول INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS
SELECT TABLE_NAME,
COLUMN_NAME,
CONSTRAINT_NAME,
REFERENCED_TABLE_NAME,
REFERENCED_COLUMN_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE REFERENCED_TABLE_NAME = 'table_name'
AND TABLE_SCHEMA = 'table_schema';