MySQL: Como determinar relações de chave estrangeira de programação?
-
07-07-2019 - |
Pergunta
esta questão mas para MySQL ....
Como posso determinar programaticamente referências de chave estrangeira no MySQL (assumindo InnoDB)? Eu quase posso obtê-los com:
SHOW TABLE STATUS WHERE Name = 'MyTableName';
... Mas, infelizmente, a coluna comentário que parece conter algumas dessas informações fica truncado, então não posso contar com ele. Deve haver alguma outra maneira ...
Eu ficaria feliz com uma chamada C API, uma instrução SQL, qualquer coisa -. Eu só preciso de algo que trabalha constantemente
Nota:. Eu também considerado analisar os resultados de uma instrução "CREATE TABLE MyTableName SHOW", mas eu realmente estou esperando há algo mais simples
Solução
Existem duas tabelas que você pode consultar para obter esta informação: INFORMATION_SCHEMA.TABLE_CONSTRAINTS
e INFORMATION_SCHEMA.KEY_COLUMN_USAGE
.
Aqui está uma consulta a partir dos comentários sobre a última página do link acima, que demonstra como obter a informação que você procura.
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 o seu nome de esquema em vez de 'test
' acima.
Outras dicas
Aqui você tem um pouco de melhoria sobre a solução @ 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;
Neste caso, eu estava filtrando por relações com os "your_table_name" campos e vendo de qual banco de dados a relação vem.
Tente 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';