データベースでmysqldumpコマンドを実行してからインポートしようとすると、ファイル内のテーブルを参照する外部キーがある場合でも、アルファベット順にテーブルを作成しようとするため失敗します。 ドキュメント には何も表示されていないようで、 this のような答えが見つかりました。
set FOREIGN_KEY_CHECKS = 0;
...original mysqldump file contents...
set FOREIGN_KEY_CHECKS = 1;
これらの行を自動的に設定したり、必要な順序でテーブルをエクスポートしたりする方法はありません(面倒でエラーが発生しやすいため、すべてのテーブル名を手動で指定する必要はありません)。これらの行をスクリプトでラップすることはできましたが、ファイルをダンプしてから手動で更新せずにインポートできるようにする簡単な方法があるかどうか疑問に思っていました。
バージョン 4.1.1 以降MySQLに含まれるmysqldump
コマンドは、デフォルトで外部キーチェックをオフにするスクリプトを生成します。次の行がダンプファイルの上部近くに含まれています。
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40014 ... */
構文は 条件付きコメント で、MySQLバージョン4.0.14以降で実行されます。古い外部キーチェックの設定は、ダンプファイルの末尾に向かって復元されます。
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
条件付きコメントは クライアントによって解釈される (サーバーではなく)であることに注意してください。サポートしていないクライアントでダンプファイルをロードすると、外部キーチェックは無効にならず、エラーが発生する可能性があります。最良の結果を得るには、公式のmysqlコマンドラインクライアントを使用してダンプファイルをロードすることをお勧めします。
mysql -hserver -uuser -p database < dumpfile.sql
mysqldump
が --compact
オプションの場合、外部キーチェックを無効にしてから再度有効にするコマンドは、ダンプファイルから省略されます。
気をつけて。何らかの理由で、--compactオプションが使用されている場合、mysqldumpはFOREIGN_KEY_CHECKS = 0を書き込みません。
チャオ。
SQLのエクスポート時にphpMyAdminを使用している場合は、Custom Export Methodを選択します。次に、チェックボックスオプションの中で、「外部キーチェックを無効にする」をクリックします。エクスポートされたSQLステートメントは、出力ファイルの最初と最後にそれぞれ、外部キーチェックを無効および有効にします。
「自動」ではありませんが、エクスポートごとにステートメントを自分で記述する必要はありません。
これは、mysqldump
コマンドの1つとして--compact
を使用する場合に発生する可能性があります。 --compact
には--skip-comments
が含まれるので、代わりに--compact
を使用する必要があります--skip-add-drop-table --skip-add-locks --skip-disable-keys --skip-set-charset
mysql
コマンドで問題なく使用するMySQLクライアントに注意してください。ダンピング:
% mysqldump -u ocp6 -pocp6 ocp6 --single-transaction --result-file=dump.sql
復元中:
% mysql -u ocp6 -pocp6 ocp6 < dump.sql
全部大丈夫です。
別のMySQLクライアント(私の状況では mycli )を使用して、ダンプファイルを復元します:
mysql ocp6@:(none)> \. dump.sql
[…]
(1005, 'Can\'t create table `ocp6`.`composition` (errno: 150 "Foreign key constraint is incorrectly formed")')