795 Stimmen

Wie kann ich alle Fremdschlüssel zu einer Tabelle oder Spalte sehen?

Wie erhalte ich in MySQL eine Liste aller Fremdschlüssel-Beschränkungen, die auf eine bestimmte Tabelle oder eine bestimmte Spalte verweisen? Das ist dasselbe wie diese Oracle-Frage sondern für MySQL.

1111voto

Vinko Vrsalovic Punkte 252104

Für einen Tisch:

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

Für eine Kolumne:

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

Im Grunde haben wir REFERENCED_TABLE_NAME durch REFERENCED_COLUMN_NAME in der where-Klausel ersetzt.

38 Stimmen

Ich erhalte immer eine leere Menge, während die von Node unten vorgeschlagene Abfrage gut funktioniert

7 Stimmen

@Acute: Sind Sie sicher, dass Sie nach der richtigen Tabelle fragen? Wenn die Abfrage von Node funktioniert, dann fragst du wahrscheinlich nach der anderen Richtung (d.h. Schlüssel FROM mytable, nicht Schlüssel TO mytable.) Das setzt voraus, dass du '<table>' mit dem Tabellennamen und ohne '<' und '>' geschrieben hast?

4 Stimmen

Scheint, als hätte ich Ihre Abfrage missverstanden, denn ich habe nach Schlüsseln gesucht, die auf die <Tabelle> verweisen :) (ja, ich schrieb Tabellenname statt "<table>" XD)

381voto

CenterOrbit Punkte 5892

EDIT: Wie in den Kommentaren erwähnt, ist dies nicht die richtige Antwort auf die Frage des Auftraggebers, aber es ist nützlich, diesen Befehl zu kennen. Diese Frage zeigte sich in Google für das, was ich suchte, und dachte, ich würde diese Antwort für die anderen zu finden verlassen.

SHOW CREATE TABLE `<yourtable>`;

Ich habe diese Antwort hier gefunden: MySQL : Befehl show constraints on tables

Ich brauchte diesen Weg, weil ich sehen wollte, wie die FK funktionierte, und nicht nur, ob sie existierte oder nicht.

49 Stimmen

Dies zeigt alle Beschränkungen in <yourtable> nicht alle Nebenbedingungen, die auf <yourtable> .

24 Stimmen

Wie @Barmar sagt, ist dies völlig falsch; es werden die Fremdschlüssel angezeigt, die zur angegebenen Tabelle gehören, aber nicht die Fremdschlüssel, die auf die Tabelle zeigen. AN die Tabelle, nach der in der Frage gefragt wird. Keine Ahnung, wie diese Frage 50 Upvotes bekommen hat; ich vermute, dass die Leute hier gelandet sind, obwohl sie eigentlich die Antwort auf die andere Frage gesucht haben, ihre Antwort hier gefunden haben und sich nicht die Mühe gemacht haben, die ursprüngliche Frage (oder sogar ihren Titel) zu lesen, bevor sie upvoten.

5 Stimmen

@MarkAmery : dies ist das erste Ergebnis von display foreign keys mysql in Google, vielleicht ist das der Grund ;)

101voto

Node Punkte 20976

Wenn Sie InnoDB und definierte FK's verwenden, können Sie z.B. die information_schema Datenbank abfragen:

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

21 Stimmen

Diese Abfrage zeigt alle Fremdschlüssel an, die auf FROM 'mytable' zeigen, nicht alle Fremdschlüssel, die auf TO 'mytable' zeigen.

1 Stimmen

Diese funktioniert in meinem Fall besser. Ich muss jede Fremdschlüssel-Beschränkung (und nur diese) aus einer Tabelle fallen lassen, um die InnoDB-Engine MyISAM oder NDB ändern zu können.

0 Stimmen

Sie können Fremdschlüssel in beide Richtungen aus der Tabelle REFERENTIAL_CONSTRAINTS erhalten - ich habe eine weitere Antwort mit der Abfrage hinzugefügt.

57voto

Andy Punkte 825

Ich schreibe auf eine alte Antwort, um einige nützliche Informationen hinzuzufügen.

Ich hatte ein ähnliches Problem, aber ich wollte auch den CONSTRAINT_TYPE zusammen mit den REFERENCED-Tabellen- und Spaltennamen sehen. Also,

  1. Um alle FKs in Ihrer Tabelle zu sehen:

    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. Um alle Tabellen und FKs in Ihrem Schema zu sehen:

    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. Um alle FKs in Ihrer Datenbank zu sehen:

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

Erinnern Sie sich!

Dabei wird die InnoDB-Speicher-Engine verwendet. Wenn nach dem Hinzufügen keine Fremdschlüssel angezeigt werden, liegt das wahrscheinlich daran, dass Ihre Tabellen MyISAM verwenden.

Zur Kontrolle:

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

Verwenden Sie zur Behebung dies:

ALTER TABLE `<yourtable>` ENGINE=InnoDB;

8 Stimmen

Diese Abfragen laufen viel schneller (von 2 Sekunden auf 0,0015 Sekunden), wenn Sie k.TABLE_SCHEMA = DATABASE() und k.TABLE_NAME = '<table>' in der WHERE-Klausel angeben, wie hier dokumentiert dev.mysql.com/doc/refman/5.5/de/

2 Stimmen

Tolle Antwort. Haben Sie eine Lösung für MyISAM?

2 Stimmen

MyISAM unterstützt leider keine Fremdschlüssel. dev.mysql.com/doc/refman/5.7/de/myisam-storage-engine.html

31voto

ChrisV Punkte 8204

Als Alternative zu Node's Antwort, wenn Sie InnoDB und definierte FK's verwenden, könnten Sie die information_schema Datenbank z.B. abfragen:

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

für Fremdschlüssel aus <Tabelle>, oder

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

für Fremdschlüssel zu <Tabelle>

Sie können auch die UPDATE_RULE und DELETE_RULE erhalten, wenn Sie diese benötigen.

2 Stimmen

Ich persönlich bevorzuge diese Antwort, da die Verwendung der Tabelle REFERENTIAL_CONSTRAINTS Ihnen die Aktualisierungs- und Kaskadenregel liefert. +1

0 Stimmen

Bei der Suche nach einer Tabelle sollte man nicht vergessen, dass Fremdschlüssel in BEIDE Richtungen erstellt werden können!

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