wake-up-neo.com

Wie finde ich alle Tabellen mit Fremdschlüsseln, die auf eine bestimmte table.column verweisen und Werte für diese Fremdschlüssel enthalten?

Ich habe eine Tabelle, deren Primärschlüssel in mehreren anderen Tabellen als Fremdschlüssel referenziert wird. Zum Beispiel:

  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`)
  )

Jetzt weiß ich nicht, wie viele Tabellen in der Datenbank Fremdschlüssel in X enthalten, wie Tabellen Y und Z. Gibt es eine SQL-Abfrage, mit der ich Folgendes zurückgeben kann:

  1. Eine Liste von Tabellen mit Fremdschlüsseln in X
  2. UND welche dieser Tabellen tatsächlich Werte im Fremdschlüssel haben
254
nebs

Bitte schön:

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

Wenn Sie mehrere Datenbanken mit ähnlichen Tabellen-/Spaltennamen haben, möchten Sie Ihre Abfrage möglicherweise auch auf eine bestimmte Datenbank beschränken:

SELECT *
FROM
  KEY_COLUMN_USAGE
WHERE
  REFERENCED_TABLE_NAME = 'X'
  AND REFERENCED_COLUMN_NAME = 'X_id'
  AND TABLE_SCHEMA = 'your_database_name';
369
Alex N.

MySQL 5.5 Referenzhandbuch: "InnoDB und FOREIGN KEY Constraints"

SELECT
  ke.REFERENCED_TABLE_SCHEMA parentSchema,
  ke.referenced_table_name parentTable,
  ke.REFERENCED_COLUMN_NAME parentColumnName,
  ke.TABLE_SCHEMA ChildSchema,
  ke.table_name childTable,
  ke.COLUMN_NAME ChildColumnName
FROM
  information_schema.KEY_COLUMN_USAGE ke
WHERE
  ke.referenced_table_name IS NOT NULL
  AND ke.REFERENCED_COLUMN_NAME = 'ci_id' ## Find Foreign Keys linked to this Primary Key
ORDER BY
  ke.referenced_table_name;
57
Ovidiu

Diese Lösung zeigt nicht nur alle Beziehungen an, sondern auch den Namen der Einschränkung, der in einigen Fällen erforderlich ist (z. B. Einschränkung löschen):

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;

Wenn Sie Tabellen in einer bestimmten Datenbank überprüfen möchten, fügen Sie Folgendes hinzu:

AND table_schema = 'database_name';
20
Panayotis

Sie finden alle schemabezogenen Informationen im weise benannten information_schema Tabelle.

Vielleicht möchten Sie die Tabelle überprüfen REFERENTIAL_CONSTRAINTS und KEY_COLUMN_USAGE. Ersteres sagt Ihnen, auf welche Tabellen von anderen verwiesen wird. Letzteres wird Ihnen sagen, wie ihre Felder zusammenhängen.

14
Seb

Auflisten aller Fremdschlüssel in einer Datenbank mit Beschreibung

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

beschränkung auf eine bestimmte Spalte in einer Tabelle

AND i1.table_name = 'target_tb_name' AND i1.column_name = 'target_col_name'
4
bortunac

Ich habe ein kleines bash onliner geschrieben, dass Sie in ein Skript schreiben können, um eine freundliche Ausgabe zu erhalten:

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/,/./'

Also die Hinrichtung: mysql_references_to transaccion (wobei transaccion ein zufälliger Tabellenname ist) gibt eine Ausgabe wie folgt aus:

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
...
3
jhvaras