วิธีค้นหาตารางทั้งหมดที่มี foreign key ที่อ้างอิง table.column โดยเฉพาะและมีค่าสำหรับ foreign key เหล่านั้นอย่างไร


272

ฉันมีตารางที่มีคีย์หลักที่อ้างอิงในตารางอื่น ๆ เป็นคีย์ต่างประเทศ ตัวอย่างเช่น:

  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. รายการของตารางที่มี foreign key เป็น X
  2. และตารางใดที่มีค่าในคีย์ต่างประเทศ

คำตอบ:


384

ไปเลย:

USE information_schema;
SELECT *
FROM
  KEY_COLUMN_USAGE
WHERE
  REFERENCED_TABLE_NAME = 'X'
  AND REFERENCED_COLUMN_NAME = 'X_id';

หากคุณมีหลายฐานข้อมูลที่มีชื่อตาราง / คอลัมน์ที่คล้ายกันคุณอาจต้องการ จำกัด แบบสอบถามของคุณไปยังฐานข้อมูลเฉพาะ:

SELECT *
FROM
  KEY_COLUMN_USAGE
WHERE
  REFERENCED_TABLE_NAME = 'X'
  AND REFERENCED_COLUMN_NAME = 'X_id'
  AND TABLE_SCHEMA = 'your_database_name';

7
เลือก TABLE_NAME ให้ดียิ่งขึ้นแล้วเลือก *
zloctb

DB ชนิดนี้มีประโยชน์อย่างไร? MySql?
Cirelli94

2
@ Cirelli94 คำถามถูกติดแท็กเป็นคำถาม MySQL
mikeschuld

61

คู่มืออ้างอิง MySQL 5.5: "InnoDB และข้อ จำกัด ของรหัสต่างประเทศ"

SELECT
  ke.REFERENCED_TABLE_SCHEMA parentSchema,
  ke.referenced_table_name parentTable,
  ke.REFERENCED_COLUMN_NAME parentColumnName,
  ke.TABLE_SCHEMA ChildSchema,
  ke.table_name childTable,
  ke.COLUMN_NAME ChildColumnName
FROM
  information_schema.KEY_COLUMN_USAGE ke
WHERE
  ke.referenced_table_name IS NOT NULL
  AND ke.REFERENCED_COLUMN_NAME = 'ci_id' ## Find Foreign Keys linked to this Primary Key
ORDER BY
  ke.referenced_table_name;

21

โซลูชันนี้จะไม่เพียงแสดงความสัมพันธ์ทั้งหมด แต่ยังรวมถึงชื่อข้อ จำกัด ซึ่งจำเป็นในบางกรณี (เช่นข้อ จำกัด การปล่อย):

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

15

คุณสามารถค้นหาข้อมูลที่เกี่ยวข้องกับสคีมาทั้งหมดในinformation_schemaตารางที่มีชื่ออย่างชาญฉลาด

คุณอาจต้องการตรวจสอบตารางและREFERENTIAL_CONSTRAINTS KEY_COLUMN_USAGEอดีตบอกคุณว่าตารางใดถูกอ้างอิงโดยผู้อื่น หลังจะบอกคุณว่าสาขาของพวกเขามีความเกี่ยวข้อง


5

รายการคีย์ต่างประเทศทั้งหมดใน 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'

3

ฉันเขียนbash onlinerเล็กน้อยที่คุณสามารถเขียนสคริปต์เพื่อให้ได้ผลลัพธ์ที่เป็นมิตร:

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(โดยที่การแปลงรหัสเป็นชื่อตารางแบบสุ่ม) จะให้ผลลัพธ์ดังนี้:

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
...

-4

ง่ายที่สุด:
1. เปิด phpMyAdmin
2. ที่ชื่อฐานข้อมูลคลิกซ้าย
3. ที่มุมบนขวาค้นหาแท็บ "ผู้ออกแบบ"

ข้อ จำกัด ทั้งหมดจะปรากฏขึ้นที่นั่น

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