referencial - relacionar tablas en sql server por codigo
MySQL: ¿cómo determinar las relaciones de clave externa programáticamente? (4)
Similar a esta pregunta, pero para MySQL ....
¿Cómo puedo determinar mediante programación las referencias de claves externas en MySQL (asumiendo InnoDB)? Casi puedo obtenerlos 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 a la 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 una declaración "SHOW CREATE TABLE MyTableName", pero realmente espero que haya algo más simple.
Aquí tienes un poco de mejora sobre 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 los campos "your_table_name" y viendo de qué base de datos proviene la relación.
Hay dos tablas que puede consultar para obtener esta información: INFORMATION_SCHEMA.TABLE_CONSTRAINTS
e 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.
Prueba 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'';