MySQL: Wie Fremdschlüsselbeziehungen programmatisch bestimmen?
-
07-07-2019 - |
Frage
ähnlich href="https://stackoverflow.com/questions/85978/query-a-tables-foreign-key-relationships"> diese Frage
Wie kann ich programmatisch Fremdschlüsselreferenzen in MySQL bestimmen (unter der Annahme InnoDB)? Ich kann sie fast bekommen mit: ... aber leider die Kommentarspalte, die einen Teil dieser Informationen zu enthalten scheint, wird abgeschnitten, so kann ich nicht auf sie verlassen. Es muss ein anderer Weg geben ... würde ich mit einem C-API-Aufruf glücklich sein, eine SQL-Anweisung, alles - ich funktioniert nur brauchen etwas, das konsequent Hinweis: Ich habe auch die Ergebnisse einer „SHOW CREATE TABLE MyTableName“ Anweisung betrachtet Parsen, aber ich hoffe wirklich, es ist etwas einfacher SHOW TABLE STATUS WHERE Name = 'MyTableName';
Lösung
Es gibt zwei Tabellen, die Sie abfragen können, um diese Informationen zu erhalten: INFORMATION_SCHEMA.KEY_COLUMN_USAGE
.
Hier ist eine Abfrage aus den Kommentaren auf der letzteren oben verlinkten Seite, die zeigt, wie die Info bekommen Sie suchen.
SELECT CONCAT( table_name, '.', column_name, ' -> ',
referenced_table_name, '.', referenced_column_name ) AS list_of_fks
FROM INFORMATION_SCHEMA.key_column_usage
WHERE referenced_table_schema = 'test'
AND referenced_table_name IS NOT NULL
ORDER BY table_name, column_name;
Verwenden des Schemanamen anstelle von 'test
' oben.
Andere Tipps
Sie erhalten hier eine kleine Verbesserung gegenüber der @ Bill Lösung:
SELECT CONSTRAINT_SCHEMA AS db,
CONCAT (
TABLE_NAME,
'.',
COLUMN_NAME,
' -> ',
REFERENCED_TABLE_NAME,
'.',
REFERENCED_COLUMN_NAME
) AS relationship
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE REFERENCED_TABLE_NAME = 'your_table_name'
ORDER BY CONSTRAINT_SCHEMA,
TABLE_NAME,
COLUMN_NAME;
In diesem Fall habe ich durch Beziehungen mit den „your_table_name“ Felder Filterung wurde und zu sehen, aus der Datenbank die Beziehung kommt.
Versuchen INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS
SELECT TABLE_NAME,
COLUMN_NAME,
CONSTRAINT_NAME,
REFERENCED_TABLE_NAME,
REFERENCED_COLUMN_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE REFERENCED_TABLE_NAME = 'table_name'
AND TABLE_SCHEMA = 'table_schema';