mysqldump dengan INSERT ... ON DUPLICATE


21

Saya ingin menggabungkan data dari satu database ke yang lain. Jadi saya membuat dump dengan mysqldumpdan kemudian mengimpornya ke database lain (dengan struktur tabel yang sama). Saya tidak memiliki masalah (seperti entri duplikat atau sesuatu yang lain) dalam kasus ini.

Tapi saya melakukan beberapa penggabungan untuk tujuan pengujian dan saya akan melakukan penggabungan akhir nanti. Jadi, saya ingin menjalankan penggabungan (data dapat diubah) beberapa kali. Perhatikan, baris saya di tabel saya tidak pernah dihapus, hanya bisa dimasukkan atau diperbarui.

Bisakah saya membuat mysqldump dengan opsi ON DUPLICATE? Atau mungkin saya bisa menggabungkan dump yang menyisipkan data baru dan memperbarui data yang dimodifikasi?

Tentu, saya bisa memasukkan ON DUPLICATEdump secara manual, tetapi saya ingin mengotomatiskan proses penggabungan.

Jawaban:


34

Ada beberapa opsi untuk membantu Anda dalam hal ini:

  --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.

Ingat paradigma ini dalam pikiran

  • mysqldump semuanya dari DB1 ke DUMP1
  • memuat DUMP1 ke dalam DB3
  • mysqldump semuanya dari DB2 menggunakan --replace (atau --insert-diabaikan) dan --no-create-info ke DUMP2
  • memuat DUMP2 ke DB3

1
Tunggu sebentar: menggunakan --replace berarti bahwa data DB2 akan menimpa data DB1, dan menggunakan --insert-diabaikan berarti bahwa data DB1 menang. Pertanyaannya tampaknya bertanya bagaimana melakukan PEMBARUAN dalam hal kunci duplikat. Bagaimanapun, saya ingin tahu.
Edward Newell

@ EdwardNewell Harap dicatat bahwa --replaceitu setara dengan melakukan ON DUPLICATE UPDATEpada setiap kolom. Sayangnya, mysqldump tidak dirancang untuk memperbarui kolom tertentu karena sifat pemuatan massal dan pembuangan mysqldump. Jawaban saya hanya mengungkapkan apa yang mampu dilakukan mysqldump. Anda harus menulis kode khusus, selain dari mysqldump, untuk melakukannya ON DUPLICATE UPDATE.
RolandoMySQLDBA

Selama DB1 dan 2 memiliki skema yang persis sama, Anda benar. Tapi anggaplah DB1 memiliki bidang tambahan. Kemudian --replace akan menyebabkan bidang tambahan untuk kembali ke default (atau kesalahan jika tidak ada default) alih-alih hanya memperbarui bidang yang dibagikan. Saya menyadari situasi OP adalah untuk dua database dengan skema yang sama, tetapi hanya menunjukkan bahwa ada adalah perbedaan, dan itu akan berguna untuk memiliki dump update-jenis benar dalam kasus-kasus tertentu (aku menghadapi satu sekarang!)
Edward Newell

1
Perhatikan bahwa jika ada kunci asing yang menunjuk ke catatan sedang diperbarui, penggunaan REPLACE INTOmungkin gagal karena catatan tidak dapat dihapus dengan memutuskan hubungan tersebut. Jika sudah ON DELETE CASCADE, maka Anda akan mengosongkan tabel yang bergantung pada yang diperbarui. REPLACE INTOOperasi yang cukup berbahaya.
Christopher Schultz

1
@RolandoMySQLDBA Setuju. Saya hanya ingin berkomentar sehingga siapa pun yang membaca jawaban ini mengerti bahwa opsi ini (khususnya REPLACE INTO) dapat berbahaya dan memiliki efek "mengejutkan". Jawaban yang bagus - hanya ingin menambahkan peringatan.
Christopher Schultz
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.