53

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

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

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

4

6 に答える 6

63

バージョン4.1.1mysqldump以降にMySQLに含まれているコマンドは、デフォルトで外部キーチェックをオフにするスクリプトを生成します。次の行は、ダンプファイルの先頭近くに含まれています。

/*!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すると、外部キーチェックを無効および再度有効にするコマンドがダンプファイルから省略されることにも注意してください。

于 2010-03-12T00:34:47.637 に答える
39

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

チャオ。

于 2013-03-25T20:59:28.117 に答える
12

SQLのエクスポート時にphpMyAdminを使用している場合は、[カスタムエクスポート方法]を選択します。次に、チェックボックスオプションの中で、[外部キーチェックを無効にする]をクリックします。エクスポートされたSQLステートメントには、出力ファイルの最初と最後にそれぞれ無効と有効の外部キーチェックがあります。

これは「自動」ではありませんが、エクスポートのたびにステートメントを自分で作成する必要はありません。

于 2013-10-04T11:16:03.727 に答える
9

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

于 2015-05-05T17:23:33.163 に答える
2

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は条件付きコメントを理解していないと思います。

于 2018-07-16T23:16:48.353 に答える
0

を使用--single-transactionすると、すべてを1つのトランザクションで実行できます。そのオプションは不正な形式を無視することはできませんForeign key constraint。どのトランザクションでも、エラーが発生するとクエリの実行が停止します。あなたの問題はあなたがForeign key constraint存在しないテーブルに持っているということです。

于 2022-01-26T17:46:27.660 に答える