volevo aa versione che mi permettesse di trovare tutte le colonne "Chiave" e "ID" con/senza un vincolo. Quindi volevo tutte le colonne rispetto alla lista di tutti i PK O FK O Null, ecco la mia richiesta. Spero che aiuti qualcun altro!
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
;
formattazione per gentile concessione di: http://www.dpriver.com/pp/sqlformat.htm
Attenzione! - Questo non restituisce fks che fanno riferimento a colonne indice univoche. Vedi http://stackoverflow.com/questions/2895219/can-we-have-a-foreign-key-which-is-not-a-primary-key-in-any-other-table. –
@Seth Reno: questo è corretto in Microsoft SQL Server, poiché è possibile fare riferimento a un indice univoco in una chiave esterna. Ma lo standard SQL non lo consente e questo non è supportato da tutti gli altri DBMS. Inoltre, non ci sono informazioni sull'indice disponibili in information_schema, quindi non c'è modo di correggerlo. Direi che se non si fa riferimento a una chiave primaria come chiave esterna, si sta facendo qualcosa di sbagliato in termini di schema. –
Questa query funziona quasi correttamente per me. Ho dovuto aggiungere 'AND KCU2.TABLE_NAME = RC.REFERENCED_TABLE_NAME' alla clausola ON di KCU2 JOIN per eliminare i record errati a causa di molte tabelle nel mio database con una chiave primaria chiamata' PRIMARY'. Mi capita di eseguire MariaDB 5.5, ma sospetto che altri DBMS avranno un problema simile. – JSmitty