No MySQL, como obtenho uma lista de todas as restrições de chave estrangeira que apontam para uma tabela específica? uma coluna em particular? É a mesma coisa que esta pergunta sobre o Oracle , mas para o MySQL.
No MySQL, como obtenho uma lista de todas as restrições de chave estrangeira que apontam para uma tabela específica? uma coluna em particular? É a mesma coisa que esta pergunta sobre o Oracle , mas para o MySQL.
Respostas:
Para uma tabela:
SELECT
TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME
FROM
INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
REFERENCED_TABLE_SCHEMA = '<database>' AND
REFERENCED_TABLE_NAME = '<table>';
Para uma coluna:
SELECT
TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME
FROM
INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
REFERENCED_TABLE_SCHEMA = '<database>' AND
REFERENCED_TABLE_NAME = '<table>' AND
REFERENCED_COLUMN_NAME = '<column>';
Basicamente, alteramos REFERENCED_TABLE_NAME por REFERENCED_COLUMN_NAME na cláusula where.
where REFERENCED_TABLE_SCHEMA = 'mydatabase' and REFERENCED_TABLE_NAME = 'mytable'
EDIT: Como indicado nos comentários, esta não é a resposta correta para a pergunta do OP, mas é útil conhecer este comando. Essa pergunta apareceu no Google para o que eu estava procurando e achei que eu deixaria essa resposta para os outros encontrarem.
SHOW CREATE TABLE `<yourtable>`;
Encontrei esta resposta aqui: MySQL: show constraints on tables command
Eu precisava desse caminho porque queria ver como o FK funcionava, em vez de apenas ver se ele existia ou não.
<yourtable>
, nem todas as restrições que apontam para <yourtable>
.
display foreign keys mysql
no google, pode ser por isso;)
Se você usa o InnoDB e define FKs, pode consultar o banco de dados information_schema, por exemplo:
SELECT * FROM information_schema.TABLE_CONSTRAINTS
WHERE information_schema.TABLE_CONSTRAINTS.CONSTRAINT_TYPE = 'FOREIGN KEY'
AND information_schema.TABLE_CONSTRAINTS.TABLE_SCHEMA = 'myschema'
AND information_schema.TABLE_CONSTRAINTS.TABLE_NAME = 'mytable';
Postagem em uma resposta antiga para adicionar algumas informações úteis.
Eu tive um problema semelhante, mas também queria ver o CONSTRAINT_TYPE junto com os nomes de tabela e coluna REFERENCED. Assim,
Para ver todos os FKs na sua tabela:
USE '<yourschema>';
SELECT i.TABLE_NAME, i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME
FROM information_schema.TABLE_CONSTRAINTS i
LEFT JOIN information_schema.KEY_COLUMN_USAGE k ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME
WHERE i.CONSTRAINT_TYPE = 'FOREIGN KEY'
AND i.TABLE_SCHEMA = DATABASE()
AND i.TABLE_NAME = '<yourtable>';
Para ver todas as tabelas e FKs no seu esquema:
USE '<yourschema>';
SELECT i.TABLE_NAME, i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME
FROM information_schema.TABLE_CONSTRAINTS i
LEFT JOIN information_schema.KEY_COLUMN_USAGE k ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME
WHERE i.CONSTRAINT_TYPE = 'FOREIGN KEY'
AND i.TABLE_SCHEMA = DATABASE();
Para ver todos os FKs no seu banco de dados:
SELECT i.TABLE_SCHEMA, i.TABLE_NAME, i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME
FROM information_schema.TABLE_CONSTRAINTS i
LEFT JOIN information_schema.KEY_COLUMN_USAGE k ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME
WHERE i.CONSTRAINT_TYPE = 'FOREIGN KEY';
Lembrar!
Isso está usando o mecanismo de armazenamento InnoDB. Se você não consegue exibir nenhuma chave estrangeira depois de adicioná-la, provavelmente é porque suas tabelas estão usando o MyISAM.
Checar:
SELECT * TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA = '<yourschema>';
Para corrigir, use o seguinte:
ALTER TABLE `<yourtable>` ENGINE=InnoDB;
Como alternativa à resposta do nó, se você usar o InnoDB e definir FKs, poderá consultar o banco de dados information_schema, por exemplo:
SELECT CONSTRAINT_NAME, TABLE_NAME, REFERENCED_TABLE_NAME
FROM information_schema.REFERENTIAL_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = '<schema>'
AND TABLE_NAME = '<table>'
para chaves estrangeiras de <table> ou
SELECT CONSTRAINT_NAME, TABLE_NAME, REFERENCED_TABLE_NAME
FROM information_schema.REFERENTIAL_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = '<schema>'
AND REFERENCED_TABLE_NAME = '<table>'
para chaves estrangeiras em <table>
Você também pode obter o UPDATE_RULE e DELETE_RULE, se desejar.
Esta solução não apenas exibirá todas as relações, mas também o nome da restrição, que é necessário em alguns casos (por exemplo, contra-queda):
select
concat(table_name, '.', column_name) as 'foreign key',
concat(referenced_table_name, '.', referenced_column_name) as 'references',
constraint_name as 'constraint name'
from
information_schema.key_column_usage
where
referenced_table_name is not null;
Se você deseja verificar as tabelas em um banco de dados específico, no final da consulta, adicione o nome do esquema:
select
concat(table_name, '.', column_name) as 'foreign key',
concat(referenced_table_name, '.', referenced_column_name) as 'references',
constraint_name as 'constraint name'
from
information_schema.key_column_usage
where
referenced_table_name is not null
and table_schema = 'database_name';
Da mesma forma, para um nome de coluna específico, adicione
e nome_tabela = 'nome_tabela
no final da consulta.
Inspirado por este post aqui
Uma maneira rápida de listar seus FKs (referências de chave estrangeira) usando o
KEY_COLUMN_USAGE view:
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 = (your schema name here)
AND REFERENCED_TABLE_NAME is not null
ORDER BY TABLE_NAME, COLUMN_NAME;
Esta consulta assume que as restrições e todas as tabelas referenciadas e de referência estão no mesmo esquema.
Adicione seu próprio comentário.
Fonte: manual oficial do mysql.
A solução que encontrei é frágil; depende da convenção de nomenclatura do django para chaves estrangeiras.
USE information_schema;
tee mysql_output
SELECT * FROM TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'FOREIGN KEY' AND TABLE_SCHEMA = 'database_name';
notee
Então, na concha,
grep 'refs_tablename_id' mysql_output
Para encontrar todas as tabelas que contêm uma chave estrangeira específica , comoemployee_id
SELECT DISTINCT TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME IN ('employee_id')
AND TABLE_SCHEMA='table_name';
Se você também deseja obter o nome da coluna da chave estrangeira:
SELECT i.TABLE_SCHEMA, i.TABLE_NAME,
i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME,
k.COLUMN_NAME, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME
FROM information_schema.TABLE_CONSTRAINTS i
LEFT JOIN information_schema.KEY_COLUMN_USAGE k
ON i.CONSTRAINT_NAME = k.CONSTRAINT_NAME
WHERE i.TABLE_SCHEMA = '<TABLE_NAME>' AND i.CONSTRAINT_TYPE = 'FOREIGN KEY'
ORDER BY i.TABLE_NAME;