INSERT…ON DUPLICATEを使用したmysqldump


21

あるデータベースのデータを別のデータベースにマージしたい。そこで、ダンプを作成しmysqldumpてから、別のデータベース(同じテーブル構造)にインポートします。この場合、問題(重複したエントリなど)はありません。

ただし、テストのためにいくつかのマージを行い、後で最終マージを行います。だから、私は数回マージを実行したい(データが変更される可能性があります)。テーブルの行は削除されず、挿入または更新のみが可能です。

ON DUPLICATEオプションでmysqldumpを作成できますか?または、新しいデータを挿入して変更されたデータを更新するダンプをマージできますか?

確かに、ON DUPLICATEダンプに手動で挿入できますが、マージプロセスを自動化したいです。

回答:


34

これに役立つオプションがあります:

  --insert-ignore     Insert rows with INSERT IGNORE.
  --replace           Use REPLACE INTO instead of INSERT INTO.
  -t, --no-create-info
                      Don't write table creation info.

このパラダイムを念頭に置いてください

  • mysqldump DB1からDUMP1へのすべて
  • DUMP1をDB3にロードする
  • --replace(または--insert-ignore)および--no-create-infoを使用してDB2からDUMP2にmysqldumpすべて
  • DUMP2をDB3にロードする

1
ちょっと待ってください。--replaceを使用するとDB2データがDB1データを上書きし、-insert-ignoreを使用するとDB1データが優先されます。質問は、重複キーの場合にUPDATEを実行する方法を尋ねるようです。いずれにせよ、私は知りたいです。
エドワード・ニューウェル14

@EdwardNewell --replaceON DUPLICATE UPDATE、すべての列で行うことと同等であることに注意してください。残念ながら、mysqldumpのバルクロードとダンプの性質のため、mysqldumpは特定の列を更新するようには設計されていません。私の答えは、mysqldumpの機能を明らかにするだけです。これを行うには、mysqldumpとは別にカスタムコードを記述する必要がありますON DUPLICATE UPDATE
RolandoMySQLDBA

DB1と2のスキーマがまったく同じであれば、その通りです。ただし、DB1に追加のフィールドがあるとします。次に、--replaceを使用すると、共有フィールドを更新するだけでなく、余分なフィールドがデフォルトに戻ります(デフォルトがない場合はエラーになります)。私はOPの状況は同じスキーマを持つ2つのデータベースのためであると認識が、ちょうどそこにいることを指摘している違いは、特定の場合には、真の更新型ダンプを有することが有用であろう(私は今、1に直面しています!)
エドワード・ニューウェル14

1
更新中のレコードを指す外部キーがある場合、REPLACE INTOそれらの関係を切断するとレコードを削除できないため、使用が失敗する可能性があることに注意してください。がある場合はON DELETE CASCADE、更新対象のテーブルに依存するテーブルを空にします。REPLACE INTO非常に危険な操作です。
クリストファーシュルツ14

1
@RolandoMySQLDBA同意しました。この回答を読んでいる人がこれらのオプション(特にREPLACE INTO)が危険であり、「驚くべき」効果があることを理解できるようにコメントしたかっただけです。良い答えです-警告を追加したかっただけです。
クリストファーシュルツ14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.