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.

War es hilfreich?

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,

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

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

Sie können auch die UPDATE_RULE und delete_rule, wenn Sie wollen.

Diese Lösung wird nicht nur alle Beziehungen anzeigen, sondern auch den Namen des Constraints, die in einigen Fällen (zum Beispiel fallen contraint) erforderlich ist:

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 in einer bestimmten Datenbanktabellen zu überprüfen, am Ende der Abfrage das Schema Namen:

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

Auch für einen bestimmten Spaltennamen, fügt

  

und table_name = ‚table_name

am Ende der Abfrage.

Angeregt durch diesen Beitrag hier

Mit REFERENCED_TABLE_NAME funktioniert nicht immer und kann ein NULL-Wert sein. Die folgende Abfrage kann arbeiten statt:

select * from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where TABLE_NAME = '<table>';

Eine schnelle Möglichkeit, Ihre FKs (Foreign Key Referenzen) zur Liste mit den

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;

Diese Abfrage nicht davon ausgehen, dass die Beschränkungen und alle referenzierten und Referenzierung Tabellen im selben Schema sind.

Fügen Sie Ihren eigenen Kommentar.

. Quelle: das offizielle MySQL-Handbuch

Die Lösung kam ich mit zerbrechlich; es stützt sich 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 werden in der Schale,

grep 'refs_tablename_id' mysql_output

Um alle Tabellen enthält einen bestimmten Fremdschlüssel wie employee_id findet

SELECT DISTINCT TABLE_NAME 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME IN ('employee_id')
AND TABLE_SCHEMA='table_name';

Wenn Sie wollen auch den Namen der Fremdspalte erhalten:

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;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top