mysql - نظريه - مقولات سكنر




كيفية العثور على كافة الجداول التي تحتوي على مفاتيح خارجية تشير إلى table.column محدد ولها قيم لهذه المفاتيح الخارجية؟ (5)

أسهل:
1. افتح phpMyAdmin
2. على اسم قاعدة بيانات النقر بزر الماوس الأيسر
3. في الزاوية اليمنى العليا تجد علامة التبويب "مصمم"

سيتم عرض جميع القيود هناك.

لدي جدول يتم الإشارة إلى مفتاحه الأساسي في العديد من الجداول الأخرى كمفتاح خارجي. فمثلا:

  CREATE TABLE `X` (
    `X_id` int NOT NULL auto_increment,
    `name` varchar(255) NOT NULL,
    PRIMARY KEY  (`X_id`)
  )
  CREATE TABLE `Y` (
    `Y_id` int(11) NOT NULL auto_increment,
    `name` varchar(255) NOT NULL,
    `X_id` int DEFAULT NULL,
    PRIMARY KEY  (`Y_id`),
    CONSTRAINT `Y_X` FOREIGN KEY (`X_id`) REFERENCES `X` (`X_id`)
  )
  CREATE TABLE `Z` (
    `Z_id` int(11) NOT NULL auto_increment,
    `name` varchar(255) NOT NULL,
    `X_id` int DEFAULT NULL,
    PRIMARY KEY  (`Z_id`),
    CONSTRAINT `Z_X` FOREIGN KEY (`X_id`) REFERENCES `X` (`X_id`)
  )

الآن ، لا أعرف عدد الجداول الموجودة في قاعدة البيانات التي تحتوي على مفاتيح خارجية في X مثل الجدولين Y و Z. هل هناك استعلام SQL يمكنني استخدامه للعودة:

  1. قائمة الجداول التي تحتوي على مفاتيح خارجية في X
  2. وأي من هذه الجداول يحتوي بالفعل على قيم في المفتاح الخارجي

إدراج جميع المفاتيح الخارجية في db بما في ذلك الوصف

    SELECT  
    i1.CONSTRAINT_NAME, i1.TABLE_NAME,i1.COLUMN_NAME,
    i1.REFERENCED_TABLE_SCHEMA,i1.REFERENCED_TABLE_NAME, i1.REFERENCED_COLUMN_NAME,
    i2.UPDATE_RULE, i2.DELETE_RULE 
    FROM   
    information_schema.KEY_COLUMN_USAGE AS i1  
    INNER JOIN 
    information_schema.REFERENTIAL_CONSTRAINTS AS i2 
    ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME 
    WHERE i1.REFERENCED_TABLE_NAME IS NOT NULL  
    AND  i1.TABLE_SCHEMA  ='db_name';

تقييد لعمود محدد في جدول الجدول

AND i1.table_name = 'target_tb_name' AND i1.column_name = 'target_col_name'

لقد كتبت بعض كتب bash على أنك تستطيع الكتابة إلى نص برمجي للحصول على مخرجات ودية:

mysql_references_to:

mysql -uUSER -pPASS -A DB_NAME -se "USE information_schema; SELECT * FROM KEY_COLUMN_USAGE WHERE REFERENCED_TABLE_NAME = '$1' AND REFERENCED_COLUMN_NAME = 'id'\G" | sed 's/^[ \t]*//;s/[ \t]*$//' |egrep "\<TABLE_NAME|\<COLUMN_NAME" |sed 's/TABLE_NAME: /./g' |sed 's/COLUMN_NAME: //g' | paste -sd "," -| tr '.' '\n' |sed 's/,$//' |sed 's/,/./'

وبالتالي التنفيذ: mysql_references_to transaccion (حيث transcion هو اسم جدول عشوائي) يعطي مخرجات كالتالي:

carrito_transaccion.transaccion_id
comanda_detalle.transaccion_id
comanda_detalle_devolucion.transaccion_positiva_id
comanda_detalle_devolucion.transaccion_negativa_id
comanda_transaccion.transaccion_id
cuenta_operacion.transaccion_id
...

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

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

يمكنك العثور على جميع المعلومات المتعلقة بالمخطط في جدول information_schema المسمى بحكمة.

قد ترغب في التحقق من الجدول REFERENTIAL_CONSTRAINTS و KEY_COLUMN_USAGE . الأول يخبرك أي الجداول المشار إليها من قبل الآخرين ؛ هذا الأخير سوف يخبرك كيف ترتبط حقولهم.





foreign-keys