mysqldumpファイルの復元中に既存のデータをスキップする方法は?
このクエリを使用して、MySQLダンプを使用してデータをインポートします(コマンドプロンプト/コマンドライン)
mysql -u root -p database_name < database_name.sql
大規模なデータベース(新しいデルタのみ)をインポートしたいので、データベースを削除して再インポートしますが、新しいデルタのみをインポートしたいと思います。
回答
私は4つの提案があります:
提案#1:でダンプを再作成する INSERT IGNORE
--insert-ignoreを使用します
INSERTステートメントではなくINSERTIGNOREステートメントを記述します。
リロードするとどうなりますか?
- 新しいデータが挿入されます。
- 既存の主キーはスキップされます
提案#2:変更INSERT
へのINSERT IGNORE
リロードの
通常ロードする代わりに
mysql -u root -p database_name < database_name.sql
ダンプをsedにパイプして、次のようにリロードするだけです。
cat database_name.sql|sed 's/^INSERT/INSERT IGNORE/'|mysql -u root -p database_name
提案#3:でダンプを再作成する REPLACE INTO
--replaceを使用します
INSERTステートメントではなくREPLACEステートメントを記述します。
リロードするとどうなりますか?
- 新しいデータが挿入されます。
- 既存の主キーは削除され、再挿入されます
提案#4:変更INSERT INTO
へのREPLACE INTO
リロードの
通常ロードする代わりに
mysql -u root -p database_name < database_name.sql
ダンプをsedにパイプして、次のようにリロードするだけです。
cat database_name.sql|sed 's/^INSERT INTO/REPLACE INTO/'|mysql -u root -p database_name
概要
- ダンプを再作成できる場合は、提案1または3を使用してください
- ダンプを再作成できない場合は、提案2または4を使用してください
試してみる !!!
私はダンプを信用しないことから始めます。したがって、データを別のデータベース(または少なくとも別のテーブル)にロードします。次に、いくつかのSQLクエリを実行して、デルタが期待どおりであることを確認します。これが「新しい」行であるか、「重複」する一意のIDがないかなどです。問題が見つかった場合は、SQLを作成して問題に対処します。 。Rolandoが示唆しているように、INSERT / REPLACE [IGNORE]などが必要な場合があります。
DELETE
'新しい'行のいくつかを、INSERT .. SELECT
残りをメインテーブルにシャベルで入れるかもしれません。または、同等に(ただし、おそらくより高速に)INSERT .. SELECT .. WHERE ..
、目的の行のみをシャベルで移動します。
FOREIGN KEYs
トラブルの原因にもなりますのでご注意ください。
配置されていないPRIMARY KEYs
場合でも、コードに含まれているJOINに注意してくださいFOREIGN KEYs
。
IODKUは通常よりも優れていREPLACE
ます。そしてそれは次の方法で行うことができます:
INSERT INTO t2 (...)
SELECT ... FROM t1 WHERE ...
ON DUPLICATE KEY UPDATE ... ;