2009-04-30 13 views
199

Ho una tabella la cui chiave primaria è referenziata in diverse altre tabelle come chiave esterna. Per esempio:Come trovare tutte le tabelle che hanno chiavi esterne che fanno riferimento a table.column e hanno valori per quelle chiavi esterne?

CREATE TABLE `X` (
    `X_id` int NOT NULL auto_increment, 
    `name` varchar(255) NOT NULL, 
    PRIMARY KEY (`X_id`) 
) 
    CREATE TABLE `Y` (
    `Y_id` int(11) NOT NULL auto_increment, 
    `name` varchar(255) NOT NULL, 
    `X_id` int DEFAULT NULL, 
    PRIMARY KEY (`Y_id`), 
    CONSTRAINT `Y_X` FOREIGN KEY (`X_id`) REFERENCES `X` (`X_id`) 
) 
    CREATE TABLE `Z` (
    `Z_id` int(11) NOT NULL auto_increment, 
    `name` varchar(255) NOT NULL, 
    `X_id` int DEFAULT NULL, 
    PRIMARY KEY (`Z_id`), 
    CONSTRAINT `Z_X` FOREIGN KEY (`X_id`) REFERENCES `X` (`X_id`) 
) 

Ora, non so quanti tavoli ci sono nel database che contiene le chiavi esterne in X come tavoli Y e Z. C'è una query SQL che posso usare per tornare:

  1. un elenco di tabelle che hanno le chiavi esterne in X
  2. e quali di queste tabelle in realtà hanno valori nella chiave esterna
+1

questa domanda mi aiuta in così tante occasioni. Vorrei poter votare più di una volta! – iGbanam

risposta

12

puoi trovare tutte le informazioni relative schema nel saggiamente chiamato 012 Tabella.

È possibile controllare la tabella REFERENTIAL_CONSTRAINTS e KEY_COLUMN_USAGE. Il primo ti dice quali tabelle sono referenziate da altri; quest'ultimo ti dirà come sono correlati i loro campi.

306

Qui si va:

USE information_schema; 
SELECT * 
FROM 
    KEY_COLUMN_USAGE 
WHERE 
    REFERENCED_TABLE_NAME = 'X' 
    AND REFERENCED_COLUMN_NAME = 'X_id'; 

Se si dispone di più database con tavoli simili nomi di colonna/si può anche voler limitare la query ad un particolare database: Manuale

SELECT * 
FROM 
    KEY_COLUMN_USAGE 
WHERE 
    REFERENCED_TABLE_NAME = 'X' 
    AND REFERENCED_COLUMN_NAME = 'X_id' 
    AND TABLE_SCHEMA = 'your_database_name'; 
+5

Potrebbe essere eseguito in modo ricorsivo? –

+0

Grazie mille! Molto utile ... –

+0

thks .. ha funzionato! – htobon

16

Questa soluzione non mostrerà solo tutte le relazioni s ma anche il nome del vincolo, che è richiesto in alcuni casi (ad es. goccia vincolo):

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, aggiungere il seguente:

AND table_schema = 'database_name'; 
3

ho scritto un po 'bash onliner che si può scrivere a uno script per ottenere un'uscita accogliente:

mysql_references_to:

mysql -uUSER -pPASS -A DB_NAME -se "USE information_schema; SELECT * FROM KEY_COLUMN_USAGE WHERE REFERENCED_TABLE_NAME = '$1' AND REFERENCED_COLUMN_NAME = 'id'\G" | sed 's/^[ \t]*//;s/[ \t]*$//' |egrep "\<TABLE_NAME|\<COLUMN_NAME" |sed 's/TABLE_NAME: /./g' |sed 's/COLUMN_NAME: //g' | paste -sd "," -| tr '.' '\n' |sed 's/,$//' |sed 's/,/./' 

Quindi l'esecuzione: mysql_references_to transaccion (dove transacción è un nome di tabella casuale) fornisce un output del tipo:

carrito_transaccion.transaccion_id 
comanda_detalle.transaccion_id 
comanda_detalle_devolucion.transaccion_positiva_id 
comanda_detalle_devolucion.transaccion_negativa_id 
comanda_transaccion.transaccion_id 
cuenta_operacion.transaccion_id 
... 
1

Listato tutte chiavi esterne in un db compresi descrizione

SELECT 
    i1.CONSTRAINT_NAME, i1.TABLE_NAME,i1.COLUMN_NAME, 
    i1.REFERENCED_TABLE_SCHEMA,i1.REFERENCED_TABLE_NAME, i1.REFERENCED_COLUMN_NAME, 
    i2.UPDATE_RULE, i2.DELETE_RULE 
    FROM 
    information_schema.KEY_COLUMN_USAGE AS i1 
    INNER JOIN 
    information_schema.REFERENTIAL_CONSTRAINTS AS i2 
    ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME 
    WHERE i1.REFERENCED_TABLE_NAME IS NOT NULL 
    AND i1.TABLE_SCHEMA ='db_name'; 

limitare ad uno specifico colonna in una tabella tavolo

AND i1.table_name = 'target_tb_name' AND i1.column_name = 'target_col_name' 
-1

più semplice:
1. Aprire phpMyAdmin
2. Sul nome del database con clic sinistro
3.Nell'angolo in alto a destra, trova la scheda "Designer"

Tutti i vincoli verranno visualizzati lì.

Problemi correlati