Como vejo todas as chaves estrangeiras para uma mesa ou coluna?
-
03-07-2019 - |
Pergunta
No MySQL, como faço para obter uma lista de todas as restrições de chave estrangeira apontando para uma tabela específica? uma coluna específica? Isso é a mesma coisa que esta pergunta do Oracle, mas para MySQL.
Solução
Para uma mesa:
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 referenciado_table_name com referenced_column_name na cláusula WHERE.
Outras dicas
EDIT: Como apontado nos comentários, essa não é a resposta correta para a pergunta do OPS, mas é útil conhecer esse comando. Essa pergunta apareceu no Google para o que eu estava procurando e imaginei que eu deixaria essa resposta para os outros encontrarem.
SHOW CREATE TABLE `<yourtable>`;
Eu encontrei esta resposta aqui:Mysql: mostre restrições no comando de tabelas
Eu precisava dessa maneira, porque queria ver como o FK funcionava, em vez de apenas ver se existia ou não.
Se você usar o InnoDB e o FK definido, poderá consultar o banco de dados do 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';
Publicação em uma resposta antiga para adicionar algumas informações úteis.
Eu tive um problema semelhante, mas também queria ver o restrint_type junto com os nomes de tabela e colunas referenciados. Então,
Para ver todos os FKs em sua mesa:
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 mesas e FKs em 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 em 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 obter nenhuma chave estrangeira para aparecer depois de adicioná -las, provavelmente é porque suas mesas estão usando o Myisam.
Checar:
SELECT * TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA = '<yourschema>';
Para consertar, use isso:
ALTER TABLE `<yourtable>` ENGINE=InnoDB;
Como alternativa à resposta do Node, se você usar o InnoDB e definir FKs, poderá consultar o banco de dados do 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 deu003Ctable> , 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 parau003Ctable>
Você também pode obter o update_rule e o delete_rule, se desejar.
Esta solução não apenas exibirá todas as relações, mas também o nome de restrição, que é necessário em alguns casos (por exemplo, Drop Contraint):
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 específico da coluna, adicione
e table_name = 'tabela_name
No final da consulta.
Inspirado neste post aqui
O uso de reference_table_name nem sempre funciona e pode ser um valor nulo. A consulta a seguir pode funcionar:
select * from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where TABLE_NAME = '<table>';
Uma maneira rápida de listar suas 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 referenciantes estão no mesmo esquema.
Adicione seu próprio comentário.
Fonte: o manual oficial do MySQL.
A solução que eu criei é frágil; Ele depende da convenção de nomenclatura de 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 mesas contendo uma chave estrangeira específica tal como employee_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 de 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;