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.

È stato utile?

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';
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top