2017-06-27 1 views
1

依存関係の順序でテーブル名を取得したいのですが。例えばMySQLのテーブル名は、依存関係順に並べられています。

:私はテーブルusersusers_ordersordersを持っている場合、私はテーブル名にこの順取得したい:users(またはorders関係ありませんが)、ordersusers_orders

もし道があれば助けてください。

+0

これは意味がありません。 – Mjh

+0

何らかの理由でJSONデータファイルを作成する必要があります。 – Buglinjo

答えて

2

外部キー定義を持つテーブルをダンプしようとしているようで、 "親"テーブルが最初にダンプされるようにして、それらを参照する "子"テーブルが外部キー定義を保証できるようにしたい働くでしょう。

これは一般的には不可能です。これは、循環的な依存関係が可能であるためです。あなたはusersと、各ユーザーは、彼らが所属するチームへの参照を持っているteamsが、teamsを持っている場合

は例えば、また、チームのキャプテンをある特定のユーザーへの参照captainを持っているあなたが最初usersを一覧表示したいです、またはteamsが最初ですか?

代わりの解決策の1つは、すべてのテーブルを任意の順序で出力することですが、外部キー定義は使用しないでください。すべてのテーブルとそのデータもリストされたら、それに続いてALTER TABLE...ADD FOREIGN KEYコマンドを実行します。

mysqldumpが使用する別の解決策は、最初にSET FOREIGN_KEY_CHECKS=0です。次に、参照先テーブルがまだ作成されているかどうかを気にせずに、外部キー制約を定義することができます。テーブルはアルファベット順にダンプされます。

しかし、より直接質問に答えるには、INFORMATION_SCHEMAを使用して、どのテーブルの依存関係が存在するかを調べることができます。

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は(まだ開発中の)MySQL 8.0までは再帰クエリをサポートしていません。したがって、依存関係のデータをアプリケーションに取り込んで、ダンプする順序を把握する必要があるでしょう。

しかし、このようにサイクルを処理することはできません。上で説明した選択肢の1つを使用する必要があります。

+1

ありがとうございました!できます!ダンプの開始時に 'SET FOREIGN_KEY_CHECKS = 0'を実行し、終了して動作した後に' SET FOREIGN_KEY_CHECKS = 1'を実行しました!ありがとうございました! – Buglinjo

関連する問題