302 Stimmen

Wie kann man alle Tabellen finden, die Fremdschlüssel haben, die auf eine bestimmte Tabellenspalte verweisen und Werte für diese Fremdschlüssel haben?

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

Nun weiß ich nicht, wie viele Tabellen es in der Datenbank gibt, die Fremdschlüssel zu X enthalten, wie die Tabellen Y und Z. Gibt es eine SQL-Abfrage, die ich verwenden kann, um zurückzugeben:

  1. Eine Liste von Tabellen, die Fremdschlüssel zu X haben
  2. UND welche dieser Tabellen tatsächlich Werte im Fremdschlüssel haben

4voto

jhvaras Punkte 1828

Ich schrieb eine kleine Bash-Onliner die 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 Ausführung: mysql_references_to transaccion (wobei transaccion ist ein zufälliger Tabellenname) ergibt eine Ausgabe wie diese:

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

0voto

ducky Punkte 1

SELECT TABELLEN_NAME, SPALTEN_NAME FROM information_schema.KEY_COLUMN_USAGE WHERE CONSTRAINT_SCHEMA LIKE 'Ihre_Datenbank' AND TABLE_SCHEMA LIKE 'Ihre_Datenbank' AND REFERENCED_TABLE_SCHEMA LIKE 'Ihre_Datenbank' AND REFERENCED_TABLE_NAME LIKE 'ihre_tabelle' AND REFERENCED_COLUMN_NAME LIKE 'Ihre_Spalte';

-4voto

Mantas D Punkte 3643

Am einfachsten:
1. Öffnen Sie phpMyAdmin
2. Klicken Sie auf der linken Seite auf Datenbankname
3. In der rechten oberen Ecke finden Sie die Registerkarte "Designer".

Dort werden alle Beschränkungen angezeigt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X