web-dev-qa-db-ja.com

外部キー制約を強制しないmysqldumpファイルを自動的に作成できますか?

データベースでmysqldumpコマンドを実行してからインポートしようとすると、ファイル内のテーブルを参照する外部キーがある場合でも、アルファベット順にテーブルを作成しようとするため失敗します。 ドキュメント には何も表示されていないようで、 this のような答えが見つかりました。

set FOREIGN_KEY_CHECKS = 0;
...original mysqldump file contents...
set FOREIGN_KEY_CHECKS = 1;

これらの行を自動的に設定したり、必要な順序でテーブルをエクスポートしたりする方法はありません(面倒でエラーが発生しやすいため、すべてのテーブル名を手動で指定する必要はありません)。これらの行をスクリプトでラップすることはできましたが、ファイルをダンプしてから手動で更新せずにインポートできるようにする簡単な方法があるかどうか疑問に思っていました。

42
Tai Squared

バージョン 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 オプションの場合、外部キーチェックを無効にしてから再度有効にするコマンドは、ダンプファイルから省略されます。

44
Phil Ross

気をつけて。何らかの理由で、--compactオプションが使用されている場合、mysqldumpはFOREIGN_KEY_CHECKS = 0を書き込みません。

チャオ。

32
edtruant

SQLのエクスポート時にphpMyAdminを使用している場合は、Custom Export Methodを選択します。次に、チェックボックスオプションの中で、「外部キーチェックを無効にする」をクリックします。エクスポートされたSQLステートメントは、出力ファイルの最初と最後にそれぞれ、外部キーチェックを無効および有効にします。

「自動」ではありませんが、エクスポートごとにステートメントを自分で記述する必要はありません。

11
alds

これは、mysqldumpコマンドの1つとして--compactを使用する場合に発生する可能性があります。 --compactには--skip-commentsが含まれるので、代わりに--compactを使用する必要があります--skip-add-drop-table --skip-add-locks --skip-disable-keys --skip-set-charset

8
iRonin

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")')

mycli が理解できない 条件付きコメント と仮定します。

2
freezed