2017-06-27 3 views
1

Ich möchte Tabellennamen erhalten, die nach ihrer Abhängigkeitsreihenfolge geordnet sind.MySQL Tabellennamen sortiert nach Abhängigkeitsreihenfolge

Zum Beispiel: Wenn ich Tabelle users, users_orders und orders I Tabellennamen dieser Auftrag erhalten möchten: users (oder orders keine Rolle spielt), orders, users_orders.

Wenn es einen Weg gibt bitte helfen.

+0

Das macht einfach keinen Sinn. – Mjh

+0

Aus irgendeinem Grund muss ich eine JSON-Datei erstellen. – Buglinjo

Antwort

2

Es klingt, als ob Sie versuchen, Tabellen mit Fremdschlüsseldefinitionen zu sichern, und Sie sicherstellen möchten, dass die übergeordneten Tabellen zuerst ausgegeben werden, damit die "untergeordneten" Tabellen ihre Fremdschlüsseldefinitionen sicherstellen können wird funktionieren.

Dies ist generell nicht möglich, da zyklische Abhängigkeiten möglich sind.

Zum Beispiel, wenn Sie users und teams haben, wo jeder Benutzer einen Verweis auf das Team hat sie angehören, aber teams hat auch einen Verweis captain auf den spezifischen Benutzer, der das Team Kapitän, sind Sie zuerst users auflisten möchten oder teams zuerst?

Eine alternative Lösung besteht darin, alle Tabellen in beliebiger Reihenfolge auszugeben, jedoch ohne Fremdschlüsseldefinitionen. Nachdem alle Tabellen und ihre Daten aufgelistet wurden, folgen Sie diesen Anweisungen mit ALTER TABLE...ADD FOREIGN KEY Befehlen.

Eine andere alternative Lösung - die von mysqldump verwendete - ist am Anfang SET FOREIGN_KEY_CHECKS=0. Dann können Sie die Fremdschlüsseleinschränkungen definieren, ohne sich Gedanken darüber machen zu müssen, ob die referenzierte Tabelle noch erstellt wurde. Die Tabellen werden in alphabetischer Reihenfolge ausgegeben.

Aber um Ihre Frage direkter zu beantworten: Sie können mit dem INFORMATION_SCHEMA herausfinden, welche Tabellenabhängigkeiten existieren.

SELECT table_schema, table_name, 
    GROUP_CONCAT(column_name ORDER BY ordinal_position) AS `columns`, 
    MAX(referenced_table_schema) AS referenced_table_schema, 
    MAX(referenced_table_name) AS referenced_table_name, 
    GROUP_CONCAT(referenced_column_name ORDER BY ordinal_position) AS `ref_columns` 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE referenced_table_schema IS NOT NULL 
GROUP BY table_schema, table_name; 

MySQL unterstützt keine rekursiven Abfragen bis MySQL 8.0 (die noch in der Entwicklung). Sie müssen also wahrscheinlich die Abhängigkeitsdaten in Ihre Anwendung holen und die Reihenfolge ermitteln, in der sie deponiert werden sollen.

Aber Sie werden immer noch nicht in der Lage sein, Zyklen auf diese Weise zu behandeln. Sie müssen eine der oben beschriebenen Alternativen verwenden.

+1

Vielen Dank! Es klappt! Ich habe 'SET FOREIGN_KEY_CHECKS = 0' am Anfang des Dumps gesetzt und 'SET FOREIGN_KEY_CHECKS = 1' nachdem es fertig ist und es hat funktioniert! Vielen Dank! – Buglinjo