2008-11-07 35 views
14

Similar a this question pero para MySQL ....MySQL: ¿Cómo determinar las relaciones de claves foráneas mediante programación?

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

SHOW TABLE STATUS WHERE Name = 'MyTableName'; 

... pero por desgracia, la columna de comentario que parece contener algo de esta información se trunca por lo que no puedo confiar en él. Debe haber alguna otra forma ...

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

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

Respuesta

29

Hay dos tablas se 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; 

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

+0

Gracias, Bill. ¡Eso hizo el truco perfectamente! –

+0

Una consulta bastante lenta .... '/ * 0 filas afectadas, 22 filas encontradas. Duración de 1 consulta: 2,996 seg. */' –

+0

@ V-Light, ¿tiene otra solución? –

2

Trate INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS

+0

Parece que no tengo esa tabla, aunque tengo INFORMATION_SCHEMA.TABLE_CONSTRAINTS que tiene la mayoría (pero no del todo) la información que necesito. ¡Gracias de todos modos! –

7

Aquí tienes 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 se filtraba por las relaciones con los campos "your_table_name" y ver de qué base de datos de la relación viene.

-1
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'; 
+0

Si bien su consulta parece funcionar, proporcione a la comunidad una pequeña declaración sobre cómo funciona. – cb0

Cuestiones relacionadas