Pregunta

Similar a esta pregunta pero para MySQL ....

¿Cómo puedo determinar mediante programación referencias de clave externa en MySQL (suponiendo InnoDB)? Casi puedo conseguirlos con:

SHOW TABLE STATUS WHERE Name = 'MyTableName';

... pero, por desgracia, la columna de comentarios que parece contener parte de esta información se trunca, por lo que no puedo confiar en ella. Debe haber alguna otra forma ...

Estaría contento con una llamada de API C, una declaración SQL, cualquier cosa, solo necesito algo que funcione de manera consistente.

Nota: También he considerado analizar los resultados de un " SHOW CREATE TABLE MyTableName " declaración, pero realmente espero que haya algo más simple.

¿Fue útil?

Solución

Hay dos tablas que puede consultar para obtener esta información: INFORMATION_SCHEMA.TABLE_CONSTRAINTS y INFORMATION_SCHEMA.KEY_COLUMN_USAGE .

Aquí hay una consulta de los comentarios en la última página vinculada anteriormente, que muestra cómo obtener la información que busca.

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;

Use su nombre de esquema en lugar de ' test ' arriba.

Otros consejos

Aquí tiene una pequeña mejora con respecto a la solución @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;

En este caso, estaba filtrando por relaciones con el " your_table_name " campos y ver de qué base de datos proviene la relación.

Pruebe 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';
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top