Wie erhalte ich in MySQL eine Liste aller Fremdschlüsseleinschränkungen, die auf eine bestimmte Tabelle verweisen? eine bestimmte Kolumne? Dies ist dasselbe wie diese Oracle-Frage , aber für MySQL.
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>';
Grundsätzlich haben wir REFERENCED_TABLE_NAME mit REFERENCED_COLUMN_NAME in der where-Klausel geändert.
BEARBEITEN: Wie in den Kommentaren erwähnt, ist dies nicht die richtige Antwort auf die OPs-Frage, aber es ist nützlich, diesen Befehl zu kennen. Diese Frage wurde in Google für das, was ich suchte, aufgetaucht, und ich dachte, ich würde diese Antwort den anderen überlassen.
SHOW CREATE TABLE `<yourtable>`;
Ich habe diese Antwort hier gefunden: MySQL: Einschränkungen für Tabellen anzeigen
Ich brauchte diesen Weg, weil ich sehen wollte, wie der FK funktionierte, anstatt nur zu sehen, ob er existierte oder nicht.
Wenn Sie InnoDB verwenden und FK definieren, können Sie die Datenbank information_schema abfragen, 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';
In einer alten Antwort posten, um nützliche Informationen hinzuzufügen.
Ich hatte ein ähnliches Problem, wollte aber auch CONSTRAINT_TYPE zusammen mit den REFERENCED-Tabellen- und -spaltennamen sehen. So,
So sehen Sie alle FK in Ihrer Tabelle:
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>';
So zeigen Sie alle Tabellen und FK in Ihrem Schema an:
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();
So sehen Sie alle FK in Ihrer Datenbank:
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';
Merken!
Dies verwendet die InnoDB-Speicher-Engine. Wenn Sie nach dem Hinzufügen keine Fremdschlüssel aufzurufen scheinen, liegt dies wahrscheinlich daran, dass Ihre Tabellen MyISAM verwenden.
Überprüfen:
SELECT * TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA = '<yourschema>';
Um dies zu beheben, verwenden Sie Folgendes:
ALTER TABLE `<yourtable>` ENGINE=InnoDB;
Als Alternative zur Antwort von Node könnten Sie, wenn Sie InnoDB verwenden und FK definieren, die information_schema-Datenbank abfragen, 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 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 UPDATE_RULE und DELETE_RULE erhalten, wenn Sie möchten.
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. Drop Contraint):
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 am Ende der Abfrage den Schemanamen hinzu:
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
and table_schema = 'database_name';
Ebenso für einen bestimmten Spaltennamen hinzufügen
und Tabellenname = 'Tabellenname
am Ende der Abfrage.
Inspiriert von diesem Beitrag hier
Eine schnelle Möglichkeit, Ihre FKs (Fremdschlüssel-Referenzen) mit der
KEY_COLUMN_USAGE view:
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 = (your schema name here)
AND REFERENCED_TABLE_NAME is not null
ORDER BY TABLE_NAME, COLUMN_NAME;
Bei dieser Abfrage wird davon ausgegangen, dass die Einschränkungen und alle referenzierten und referenzierenden Tabellen sich im selben Schema befinden.
Fügen Sie Ihren eigenen Kommentar hinzu.
Quelle: das offizielle Handbuch zu mysql.
Die Verwendung von REFERENCED_TABLE_NAME funktioniert nicht immer und kann ein NULL-Wert sein. Die folgende Abfrage kann stattdessen funktionieren:
select * from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where TABLE_NAME = '<table>';
So suchen Sie alle Tabellen die einen bestimmten Fremdschlüssel enthalten, beispielsweise employee_id
SELECT DISTINCT TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME IN ('employee_id')
AND TABLE_SCHEMA='table_name';
Die Lösung, die ich mir ausgedacht habe, ist fragil. Es basiert auf Djangos Namenskonvention für Fremdschlüssel.
USE information_schema;
tee mysql_output
SELECT * FROM TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'FOREIGN KEY' AND TABLE_SCHEMA = 'database_name';
notee
Dann in der Shell,
grep 'refs_tablename_id' mysql_output
Wenn Sie auch den Namen der Fremdschlüsselspalte erhalten möchten:
SELECT i.TABLE_SCHEMA, i.TABLE_NAME,
i.CONSTRAINT_TYPE, i.CONSTRAINT_NAME,
k.COLUMN_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.TABLE_SCHEMA = '<TABLE_NAME>' AND i.CONSTRAINT_TYPE = 'FOREIGN KEY'
ORDER BY i.TABLE_NAME;