Je voulais aa version qui me permettrait de trouver toutes les colonnes "Key" et "ID" ayant/manquant une contrainte. Donc, je voulais toutes les colonnes par rapport à la liste de tous PK OU FK OU Null, voici ma requête. J'espère que ça aide quelqu'un d'autre!
SELECT
c.table_schema
,c.table_name
,c.column_name
,KeyConstraints.constraint_type
,KeyConstraints.constraint_schema
,KeyConstraints.constraint_name
,KeyConstraints.referenced_table_schema
,KeyConstraints.referenced_table_name
,KeyConstraints.referenced_column_name
,KeyConstraints.update_rule
,KeyConstraints.delete_rule
FROM information_schema.columns AS c
LEFT JOIN
(
SELECT
FK.table_schema AS TABLE_SCHEMA
,FK.table_name
,CU.column_name
,FK.constraint_type
,c.constraint_schema
,C.constraint_name
,PK.table_schema AS REFERENCED_TABLE_SCHEMA
,PK.table_name AS REFERENCED_TABLE_NAME
,CCU.column_name AS REFERENCED_COLUMN_NAME
,C.update_rule
,C.delete_rule
FROM information_schema.referential_constraints AS C
INNER JOIN information_schema.table_constraints AS FK
ON C.constraint_name = FK.constraint_name
INNER JOIN information_schema.table_constraints AS PK
ON C.unique_constraint_name = PK.constraint_name
INNER JOIN information_schema.key_column_usage AS CU
ON C.constraint_name = CU.constraint_name
INNER JOIN information_schema.constraint_column_usage AS CCU
ON PK.constraint_name = CCU.constraint_name
WHERE (FK.constraint_type = 'FOREIGN KEY')
UNION
SELECT
ccu.table_schema
,ccu.table_name
,ccu.column_name
,tc.constraint_type
,ccu.constraint_schema
,ccu.constraint_name
,NULL
,NULL
,NULL
,NULL
,NULL
FROM information_schema.constraint_column_usage ccu
INNER JOIN information_schema.table_constraints tc
ON ccu.table_schema = tc.table_schema
AND ccu.table_name = tc.table_name
WHERE tc.constraint_type = 'PRIMARY KEY'
) AS KeyConstraints
ON c.table_schema = KeyConstraints.table_schema
AND c.table_name = KeyConstraints.table_name
AND c.column_name = KeyConstraints.column_name
WHERE c.column_name LIKE '%ID' OR c.column_name LIKE '%Key'
ORDER BY c.table_schema
,c.table_name
,c.column_name
;
mise en forme avec la permission de: http://www.dpriver.com/pp/sqlformat.htm clés étrangères
Attention! - Cela ne retourne pas les fks qui référencent des colonnes d'index uniques. Voir http://stackoverflow.com/questions/2895219/can-we-have-a-key-fore-which-is-not-a-primary-key-in-other-other-table. –
@Seth Reno: Ceci est correct dans Microsoft SQL Server, car là vous pouvez référencer un index unique dans une clé étrangère. Mais le standard SQL ne le permet pas, et ceci n'est pas supporté par tous les autres SGBD. De plus, il n'y a pas d'information d'index disponible dans information_schema, donc il n'y a aucun moyen de corriger cela. Je dirais que si vous ne faites pas référence à une clé primaire en tant que clé étrangère, vous faites quelque chose de mal en termes de schémas. –
Cette requête fonctionne presque correctement pour moi. J'ai dû ajouter 'AND KCU2.TABLE_NAME = RC.REFERENCED_TABLE_NAME' à la clause ON du KCU2 JOIN afin d'éliminer les enregistrements incorrects en raison de nombreuses tables dans ma base de données avec une clé primaire nommée' PRIMARY'. Il se trouve que je cours avec MariaDB 5.5, mais je soupçonne que d'autres SGBD auront un problème similaire. – JSmitty