Dans MySQL, comment obtenir une liste de toutes les contraintes de clé étrangère pointant vers une table particulière? une colonne particulière? C'est la même chose que cette question Oracle , mais pour MySQL.
Dans MySQL, comment obtenir une liste de toutes les contraintes de clé étrangère pointant vers une table particulière? une colonne particulière? C'est la même chose que cette question Oracle , mais pour MySQL.
Réponses:
Pour une table:
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>';
Pour une colonne:
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>';
Fondamentalement, nous avons modifié REFERENCED_TABLE_NAME par REFERENCED_COLUMN_NAME dans la clause where.
where REFERENCED_TABLE_SCHEMA = 'mydatabase' and REFERENCED_TABLE_NAME = 'mytable'
EDIT: Comme indiqué dans les commentaires, ce n'est pas la bonne réponse à la question OP, mais il est utile de connaître cette commande. Cette question est apparue dans Google pour ce que je cherchais, et a pensé que je laisserais cette réponse aux autres.
SHOW CREATE TABLE `<yourtable>`;
J'ai trouvé cette réponse ici: MySQL: commande afficher les contraintes sur les tables
J'avais besoin de cette façon parce que je voulais voir comment le FK fonctionnait, plutôt que de simplement voir s'il existait ou non.
<yourtable>
, pas toutes les contraintes qui pointent vers <yourtable>
.
display foreign keys mysql
google, c'est peut-être pour ça;)
Si vous utilisez InnoDB et définissez des FK, vous pouvez interroger la base de données information_schema, par exemple:
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';
Publier sur une ancienne réponse pour ajouter des informations utiles.
J'ai eu un problème similaire, mais je voulais également voir le CONSTRAINT_TYPE avec les noms de table et de colonne REFERENCED. Donc,
Pour voir tous les FK dans votre tableau:
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>';
Pour voir toutes les tables et tous les FK de votre schéma:
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();
Pour voir tous les FK dans votre base de données:
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';
Rappelles toi!
Cela utilise le moteur de stockage InnoDB. Si vous n'arrivez pas à faire apparaître de clés étrangères après les avoir ajoutées, c'est probablement parce que vos tables utilisent MyISAM.
Vérifier:
SELECT * TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA = '<yourschema>';
Pour corriger, utilisez ceci:
ALTER TABLE `<yourtable>` ENGINE=InnoDB;
Comme alternative à la réponse de Node, si vous utilisez InnoDB et définissez des FK, vous pouvez interroger la base de données information_schema, par exemple:
SELECT CONSTRAINT_NAME, TABLE_NAME, REFERENCED_TABLE_NAME
FROM information_schema.REFERENTIAL_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = '<schema>'
AND TABLE_NAME = '<table>'
pour les clés étrangères 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>'
pour les clés étrangères à <table>
Vous pouvez également obtenir les UPDATE_RULE et DELETE_RULE si vous les souhaitez.
Cette solution affichera non seulement toutes les relations mais aussi le nom de la contrainte, ce qui est nécessaire dans certains cas (par exemple 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;
Si vous souhaitez vérifier les tables dans une base de données spécifique, à la fin de la requête, ajoutez le nom du schéma:
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';
De même, pour un nom de colonne spécifique, ajoutez
et table_name = 'table_name
à la fin de la requête.
Inspiré par ce post ici
Un moyen rapide de répertorier vos FK (références de clé étrangère) en utilisant le
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;
Cette requête suppose que les contraintes et toutes les tables référencées et référençantes sont dans le même schéma.
Ajoutez votre propre commentaire.
Source: le manuel mysql officiel.
La solution que j'ai trouvée est fragile; il s'appuie sur la convention de dénomination de django pour les clés étrangères.
USE information_schema;
tee mysql_output
SELECT * FROM TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'FOREIGN KEY' AND TABLE_SCHEMA = 'database_name';
notee
Ensuite, dans la coquille,
grep 'refs_tablename_id' mysql_output
Pour rechercher toutes les tables contenant une clé étrangère particulière telle queemployee_id
SELECT DISTINCT TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME IN ('employee_id')
AND TABLE_SCHEMA='table_name';
Si vous souhaitez également obtenir le nom de la colonne de clé étrangère:
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;