795 Stimmen

Wie kann ich alle Fremdschlüssel zu einer Tabelle oder Spalte sehen?

Wie erhalte ich in MySQL eine Liste aller Fremdschlüssel-Beschränkungen, die auf eine bestimmte Tabelle oder eine bestimmte Spalte verweisen? Das ist dasselbe wie diese Oracle-Frage sondern für MySQL.

26voto

imatwork Punkte 395

Constraints in SQL sind die Regeln, die für die Daten in einer Tabelle definiert sind. Constraints schränken auch die Arten von Daten ein, die in die Tabelle eingehen. Wenn neue Daten diese Regeln nicht einhalten, wird die Aktion abgebrochen.

select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where CONSTRAINT_TYPE = 'FOREIGN KEY';

Sie können alle Beschränkungen anzeigen, indem Sie select * from information_schema.table_constraints;

(Dies wird eine Menge Tabellendaten erzeugen).

Sie können dies auch für MySQL verwenden:

show create table tableName;

1 Stimmen

Bitte fügen Sie eine Erklärung hinzu, um den langfristigen Wert der Frage zu verdeutlichen und sie in eine qualitativ hochwertige Antwort zu verwandeln, die mit größerer Wahrscheinlichkeit hochgestuft wird. Antworten sollten zukünftigen Besuchern helfen, etwas zu lernen und schnell festzustellen, ob Elemente aus Ihrer Lösung auf ihre eigenen Programmierprobleme zutreffen.

0 Stimmen

Die Kenntnis der Namen der Fremdschlüssel ist nicht wirklich hilfreich.

0 Stimmen

Das war eine große Hilfe. Bei anderen Antworten müssen Sie Namen angeben. So können Sie alle Fremdschlüssel generisch finden. Das ist genau das, wonach ich gesucht habe.

14voto

Panayotis Punkte 1698

Bei dieser Lösung werden nicht nur alle Beziehungen, sondern auch der Name der Einschränkung angezeigt, was in einigen Fällen erforderlich ist (z. B. Einschränkung fallen lassen):

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 Namen des Schemas 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ür einen bestimmten Spaltennamen fügen Sie ebenfalls

und tabellenname = 'tabellenname

am Ende der Abfrage.

Inspiriert durch diesen Beitrag aquí

8voto

Hazok Punkte 5035

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

8voto

DJDave Punkte 847

Ich füge nur ungern eine weitere Antwort hinzu, aber ich musste bei den anderen betteln, borgen und stehlen, um das zu bekommen, was ich will, nämlich eine vollständige Liste aller FK-Beziehungen zu Tabellen in einem bestimmten Schema, einschließlich der FKs zu Tabellen in anderen Schemata. Die beiden entscheidenden Recordsets sind information_schema.KEY_COLUMN_USAGE und information_schema.referential_constraints. Wenn ein gewünschtes Attribut fehlt, entfernen Sie einfach das Kommentarzeichen in der KCU. , RC. um zu sehen, was verfügbar ist

SELECT DISTINCT KCU.TABLE_NAME, KCU.COLUMN_NAME, REFERENCED_TABLE_SCHEMA, KCU.REFERENCED_TABLE_NAME, KCU.REFERENCED_COLUMN_NAME, UPDATE_RULE, DELETE_RULE #, KCU.*, RC.*
FROM information_schema.KEY_COLUMN_USAGE KCU
INNER JOIN information_schema.referential_constraints RC ON KCU.CONSTRAINT_NAME = RC.CONSTRAINT_NAME
WHERE TABLE_SCHEMA = (your schema name)
AND KCU.REFERENCED_TABLE_NAME IS NOT NULL
ORDER BY KCU.TABLE_NAME, KCU.COLUMN_NAME;

7voto

John Muraguri Punkte 316

Es ist oft nützlich, das Aktualisierungs- und Löschverhalten zu kennen, was die anderen Antworten nicht bieten. Also, los geht's.

SELECT cu.table_name,
       cu.column_name,
       cu.constraint_name,
       cu.referenced_table_name,
       cu.referenced_column_name,
       IF(rc.update_rule = 'NO ACTION', 'RESTRICT', rc.update_rule) AS update_rule, -- See: https://stackoverflow.com/a/1498015/2742117
       IF(rc.delete_rule = 'NO ACTION', 'RESTRICT', rc.delete_rule) AS delete_rule -- See: https://stackoverflow.com/a/1498015/2742117
FROM information_schema.key_column_usage cu
INNER JOIN information_schema.referential_constraints rc ON rc.table_name = cu.table_name
AND rc.constraint_name = cu.constraint_name
WHERE cu.referenced_table_schema = '<your schema>'
  AND cu.referenced_table_name = '<your table>';

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X