依存関係の順序でテーブル名を取得したいのですが。例えばMySQLのテーブル名は、依存関係順に並べられています。
:私はテーブルusers
、users_orders
とorders
を持っている場合、私はテーブル名にこの順取得したい:users
(またはorders
関係ありませんが)、orders
、users_orders
。
もし道があれば助けてください。
依存関係の順序でテーブル名を取得したいのですが。例えばMySQLのテーブル名は、依存関係順に並べられています。
:私はテーブルusers
、users_orders
とorders
を持っている場合、私はテーブル名にこの順取得したい:users
(またはorders
関係ありませんが)、orders
、users_orders
。
もし道があれば助けてください。
外部キー定義を持つテーブルをダンプしようとしているようで、 "親"テーブルが最初にダンプされるようにして、それらを参照する "子"テーブルが外部キー定義を保証できるようにしたい働くでしょう。
これは一般的には不可能です。これは、循環的な依存関係が可能であるためです。あなたは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つを使用する必要があります。
ありがとうございました!できます!ダンプの開始時に 'SET FOREIGN_KEY_CHECKS = 0'を実行し、終了して動作した後に' SET FOREIGN_KEY_CHECKS = 1'を実行しました!ありがとうございました! – Buglinjo
これは意味がありません。 – Mjh
何らかの理由でJSONデータファイルを作成する必要があります。 – Buglinjo