MySQL: come determinare le relazioni di chiave esterna a livello di codice?
-
07-07-2019 - |
Domanda
Simile a questa domanda ma per MySQL ....
Come posso determinare a livello di codice i riferimenti a chiave esterna in MySQL (supponendo InnoDB)? Posso quasi ottenerli con:
SHOW TABLE STATUS WHERE Name = 'MyTableName';
... ma ahimè, la colonna dei commenti che sembra contenere alcune di queste informazioni viene troncata, quindi non posso fare affidamento su di essa. Ci deve essere un altro modo ...
Sarei felice con una chiamata API C, un'istruzione SQL, qualsiasi cosa - ho solo bisogno di qualcosa che funzioni costantemente.
Nota: ho anche considerato l'analisi dei risultati di un "SHOW CREATE TABLE MyTableName " , ma spero davvero che ci sia qualcosa di più semplice.
Soluzione
Esistono due tabelle su cui è possibile eseguire query per ottenere queste informazioni: INFORMATION_SCHEMA.TABLE_CONSTRAINTS
e INFORMATION_SCHEMA.KEY_COLUMN_USAGE
.
Ecco una query dai commenti sull'ultima pagina collegata sopra, che dimostra come ottenere le informazioni che cerchi.
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 = 'test'
AND referenced_table_name IS NOT NULL
ORDER BY table_name, column_name;
Usa il nome del tuo schema anziché " test
" sopra.
Altri suggerimenti
Qui hai un piccolo miglioramento rispetto alla soluzione @bill:
SELECT CONSTRAINT_SCHEMA AS db,
CONCAT (
TABLE_NAME,
'.',
COLUMN_NAME,
' -> ',
REFERENCED_TABLE_NAME,
'.',
REFERENCED_COLUMN_NAME
) AS relationship
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE REFERENCED_TABLE_NAME = 'your_table_name'
ORDER BY CONSTRAINT_SCHEMA,
TABLE_NAME,
COLUMN_NAME;
In questo caso stavo filtrando in base alle relazioni con " nome_tabella " campi e vedere da quale database proviene la relazione.
Prova INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS
SELECT TABLE_NAME,
COLUMN_NAME,
CONSTRAINT_NAME,
REFERENCED_TABLE_NAME,
REFERENCED_COLUMN_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE REFERENCED_TABLE_NAME = 'table_name'
AND TABLE_SCHEMA = 'table_schema';