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

Foi útil?

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';
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top