Wie erhalte ich in MySQL eine Liste aller Fremdschlüsseleinschränkungen, die auf eine bestimmte Tabelle verweisen? eine bestimmte Spalte? Dies ist dasselbe wie diese Oracle-Frage , jedoch für MySQL.
Wie erhalte ich in MySQL eine Liste aller Fremdschlüsseleinschränkungen, die auf eine bestimmte Tabelle verweisen? eine bestimmte Spalte? Dies ist dasselbe wie diese Oracle-Frage , jedoch für MySQL.
Antworten:
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 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>';
Grundsätzlich haben wir REFERENCED_TABLE_NAME in der where-Klausel durch REFERENCED_COLUMN_NAME geändert.
where REFERENCED_TABLE_SCHEMA = 'mydatabase' and REFERENCED_TABLE_NAME = 'mytable'
BEARBEITEN: Wie in den Kommentaren erwähnt, ist dies nicht die richtige Antwort auf die Frage des OP, aber es ist nützlich, diesen Befehl zu kennen. Diese Frage tauchte in Google für das auf, wonach ich suchte, und dachte, ich würde diese Antwort den anderen überlassen, um sie zu finden.
SHOW CREATE TABLE `<yourtable>`;
Ich habe diese Antwort hier gefunden: MySQL: show Einschränkungen für Tabellenbefehl
Ich brauchte diesen Weg, weil ich sehen wollte, wie der FK funktioniert, anstatt nur zu sehen, ob er existiert oder nicht.
<yourtable>
, nicht alle Einschränkungen, auf die verwiesen wird <yourtable>
.
display foreign keys mysql
in Google, vielleicht deshalb;)
Wenn Sie InnoDB verwenden und FKs 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';
Veröffentlichen Sie eine alte Antwort, um einige nützliche Informationen hinzuzufügen.
Ich hatte ein ähnliches Problem, wollte aber auch CONSTRAINT_TYPE zusammen mit den Tabellen- und Spaltennamen REFERENCED sehen. Damit,
So zeigen Sie alle FKs in Ihrer Tabelle 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()
AND i.TABLE_NAME = '<yourtable>';
So zeigen Sie alle Tabellen und FKs 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 zeigen Sie alle FKs in Ihrer Datenbank an:
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 nach dem Hinzufügen keine Fremdschlüssel angezeigt werden, liegt dies wahrscheinlich daran, dass Ihre Tabellen MyISAM verwenden.
Überprüfen:
SELECT * TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA = '<yourschema>';
Verwenden Sie zum Beheben Folgendes:
ALTER TABLE `<yourtable>` ENGINE=InnoDB;
Wenn Sie als Alternative zur Antwort von Node InnoDB verwenden und FKs definieren, können Sie die Datenbank information_schema 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 abrufen, wenn Sie dies möchten.
Diese Lösung zeigt nicht nur alle Beziehungen an, sondern auch den in einigen Fällen erforderlichen Einschränkungsnamen (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';
Fügen Sie für einen bestimmten Spaltennamen ebenfalls hinzu
und table_name = 'table_name
am Ende der Abfrage.
Inspiriert von diesem Beitrag hier
Eine schnelle Möglichkeit, Ihre FKs (Fremdschlüsselreferenzen) mithilfe von aufzulisten
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 sich die Einschränkungen und alle referenzierten und referenzierenden Tabellen im selben Schema befinden.
Fügen Sie Ihren eigenen Kommentar hinzu.
Quelle: das offizielle MySQL-Handbuch.
Die Lösung, die ich gefunden habe, ist fragil. Es basiert auf der Namenskonvention von Django 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 Schale,
grep 'refs_tablename_id' mysql_output
So finden Sie alle Tabellen, die einen bestimmten Fremdschlüssel enthalten, zemployee_id
SELECT DISTINCT TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME IN ('employee_id')
AND TABLE_SCHEMA='table_name';
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;