Wie sehe ich alle Fremdschlüssel zu einer Tabelle oder Spalte?
-
03-07-2019 - |
Frage
In MySQL, wie bekomme ich eine Liste aller Fremdschlüssel-Constraints zeigt auf eine bestimmte Tabelle? eine bestimmte Spalte? Dies ist die gleiche wie diese Oracle Frage , aber für MySQL.
Lösung
Für eine Tabelle:
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 Spalte:
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 geändert REFERENCED_TABLE_NAME mit REFERENCED_COLUMN_NAME in der where-Klausel.
Andere Tipps
EDIT: Wie in den Kommentaren darauf hingewiesen, dies ist nicht die richtige Antwort auf die OPs Frage, aber es ist sinnvoll, diesen Befehl zu kennen. Diese Frage zeigte in Google für das, was ich suchte, und ich dachte, für die andere diese Antwort verlassen würde zu finden.
SHOW CREATE TABLE `<yourtable>`;
Ich fand diese Antwort hier: MySQL: anzeigen Einschränkungen für Tabellen Befehl
Ich brauchte diese Weise, weil ich sehen wollte, wie der FK funktioniert, und nicht nur sehen, ob es existiert oder nicht.
Wenn Sie InnoDB verwenden und definiert FK die Sie die information_schema Datenbank abfragen könnte z.
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';
Posting auf einer alten Antwort einige nützliche Informationen hinzuzufügen.
Ich hatte ein ähnliches Problem, aber ich wollte ebenfalls zusammen mit den referenzierten Tabellen- und Spaltennamen die CONSTRAINT_TYPE sehen. Also,
-
Um alle FKs in der 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>';
-
Um alle Tabellen und FKs in Ihrem 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();
-
Um alle FKs in Ihrer Datenbank finden Sie unter:
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';
Speichern
Dies wird mit Hilfe der Speicher-Engine InnoDB. Wenn Sie keine Fremdschlüssel zu bekommen scheinen, zu zeigen, nachdem sie das Hinzufügen es ist wahrscheinlich, weil die Tabellen MyISAM verwenden.
Um zu überprüfen:
SELECT * TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA = '<yourschema>';
Um dies zu beheben, verwenden Sie diese:
ALTER TABLE `<yourtable>` ENGINE=InnoDB;
Als Alternative zum Knoten Antwort, wenn Sie InnoDB verwenden und definiert FK die Sie die information_schema Datenbank abfragen könnte z.
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 von