Domanda

In MySQL, come posso ottenere un elenco di tutti i vincoli di chiave esterna che puntano a una tabella particolare? una colonna particolare? Questa è la stessa cosa di questa domanda Oracle , ma per MySQL.

È stato utile?

Soluzione

Per una tabella:

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>';

Per una colonna:

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>';

In sostanza, abbiamo cambiato REFERENCED_TABLE_NAME con REFERENCED_COLUMN_NAME nella clausola where.

Altri suggerimenti

MODIFICA: Come sottolineato nei commenti, questa non è la risposta corretta alla domanda dei PO, ma è utile conoscere questo comando. Questa domanda è emersa su Google per quello che stavo cercando, e ho pensato che avrei lasciato questa risposta per essere trovata dagli altri.

SHOW CREATE TABLE `<yourtable>`;

Ho trovato questa risposta qui: MySQL: mostra i vincoli sul comando tabelle

Avevo bisogno di questo perché volevo vedere come funzionava l'FK, piuttosto che vedere se esistesse o meno.

Se si utilizza InnoDB e si definiscono gli FK, è possibile eseguire una query sul database information_schema, ad es .:

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';

Pubblicazione su una vecchia risposta per aggiungere alcune informazioni utili.

Ho avuto un problema simile, ma volevo anche vedere CONSTRAINT_TYPE insieme ai nomi di tabella e colonna REFERENCED. Così,

  1. Per vedere tutti gli FK nella tua tabella:

    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>';
    
  2. Per vedere tutte le tabelle e gli FK nel tuo schema:

    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();
    
  3. Per vedere tutti gli FK nel tuo database:

    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';
    

Ricorda!

Questo utilizza il motore di archiviazione InnoDB. Se non riesci a visualizzare le chiavi esterne dopo averle aggiunte, probabilmente è perché le tue tabelle utilizzano MyISAM.

Per controllare:

SELECT * TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA = '<yourschema>';

Per risolvere, usa questo:

ALTER TABLE `<yourtable>` ENGINE=InnoDB;

In alternativa alla risposta del nodo & # 8217; se si utilizza InnoDB e si definisce FK & # 8217; s è possibile eseguire una query nel database information_schema, ad es .:

SELECT CONSTRAINT_NAME, TABLE_NAME, REFERENCED_TABLE_NAME
FROM information_schema.REFERENTIAL_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = '<schema>'
AND TABLE_NAME = '<table>'

per le chiavi esterne da < tabella > ;, oppure

SELECT CONSTRAINT_NAME, TABLE_NAME, REFERENCED_TABLE_NAME
FROM information_schema.REFERENTIAL_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = '<schema>'
AND REFERENCED_TABLE_NAME = '<table>'

per le chiavi esterne su < tabella >

Puoi anche ottenere UPDATE_RULE e DELETE_RULE se vuoi.

Questa soluzione non mostrerà solo tutte le relazioni, ma anche il nome del vincolo, che è richiesto in alcuni casi (ad es. 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;

Se si desidera controllare le tabelle in un database specifico, alla fine della query aggiungere il nome dello schema:

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';

Allo stesso modo, per un nome di colonna specifico, aggiungi

  

e table_name = 'table_name

alla fine della query.

Ispirato da questo post qui

L'uso di REFERENCED_TABLE_NAME non sempre funziona e può essere un valore NULL. La seguente query può invece funzionare:

select * from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where TABLE_NAME = '<table>';

Un modo rapido per elencare i tuoi FK (riferimenti a chiave esterna) usando

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;

Questa query presuppone che i vincoli e tutte le tabelle di riferimento e di riferimento siano nello stesso schema.

Aggiungi il tuo commento.

Fonte: il manuale mysql ufficiale.

La soluzione che ho trovato è fragile; si basa sulla convenzione di denominazione di Django per le chiavi esterne.

USE information_schema;
tee mysql_output
SELECT * FROM TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'FOREIGN KEY' AND TABLE_SCHEMA = 'database_name';
notee

Quindi, nella shell,

grep 'refs_tablename_id' mysql_output

Per trovare tutte le tabelle contenenti una particolare chiave esterna come employee_id

SELECT DISTINCT TABLE_NAME 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME IN ('employee_id')
AND TABLE_SCHEMA='table_name';

Se vuoi anche ottenere il nome della colonna chiave esterna:

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