web-dev-qa-db-de.com

Wie sehe ich alle Fremdschlüssel einer Tabelle oder Spalte?

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.

474

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.

643
Vinko Vrsalovic

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.

220
CenterOrbit

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

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,

  1. 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>';
    
  2. 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();
    
  3. 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;
41
Andy

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.

21
ChrisV

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

8
Panayotis

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.

3
Daniel Rodas

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

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';
3
Anthony Vipond

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
2

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;
0
omarjebari