Ketika Anda mengatakan bahwa PK mungkin bentrok, maksud Anda mungkin ada baris duplikat dan Anda tidak ingin mereka disalin, atau bahwa Anda perlu menetapkan PK baru ke salah satu dari mereka karena baris tersebut benar-benar berbeda meskipun memiliki baris PK yang sama? (alasan lain untuk menggunakan kunci primer alami)
Tom H
Jawaban:
123
Anda juga bisa mencoba:
INSERT IGNORE
INTO table_1
SELECT*FROM table_2
;
yang memungkinkan baris tersebut di tabel_1 untuk menggantikan baris di tabel_2 yang memiliki kunci utama yang cocok, sambil tetap menyisipkan baris dengan kunci utama baru.
Kalau tidak,
REPLACE
INTO table_1
SELECT*FROM table_2
;
akan memperbarui baris yang sudah ada di table_1 dengan baris yang sesuai dari table_2, sambil menyisipkan baris dengan kunci primer baru.
Sebenarnya, ini akan MENGGANTI baris yang ada (hapus + sisipkan), bukan pembaruan.
Cees Timmerman
bagaimana jika ada kunci asing yang digunakan untuk tabel 2 ????? Bagaimana Anda akan memperbaruinya?
Kshitiz
39
Itu tergantung pada semantik kunci utama. Jika itu hanya autoincrement, maka gunakan sesuatu seperti:
insertinto table1 (all columns except pk)select all_columns_except_pk
from table2;
Jika PK berarti sesuatu, Anda perlu menemukan cara untuk menentukan rekaman mana yang harus diprioritaskan. Anda dapat membuat kueri pemilihan untuk menemukan duplikat terlebih dahulu (lihat jawaban dengan cpitis ). Kemudian hilangkan yang tidak ingin Anda simpan dan gunakan sisipan di atas untuk menambahkan catatan yang tersisa.
Terima kasih untuk ide yang bagus. Cmd di atas memberi saya kesalahan sintaks. Tapi ini berfungsi untuk saya: INSERT INTO first_table SELECT * FROM second_table ON DUPLICATE KEY UPDATE second_table.column1 = DO_WHAT_EVER_MUST_BE_DONE_ON_KEY_CLASH (first_table.column1)
Tapper
Sama seperti @Tapper, saya tidak bisa menetapkan Alias ke tabel pertama. Saya akan mendapatkan Syntax error, unexpected IDENT_QUOTED- melalui MySQL Workbench.
blo0p3r
Bisakah Anda memberikan contoh perintah apa yang akan Anda masukkan pada baris terakhir? Saya ingin ID bertambah dari ID tertinggi yang ada di tabel
Elliott B
15
Jika Anda perlu melakukannya secara manual, satu kali:
Pertama, gabungkan dalam tabel sementara, dengan sesuatu seperti:
ketika saya mencoba ini saya menerima kesalahan ini, "ERROR 1064 (42000): Anda memiliki kesalahan dalam sintaks SQL Anda; periksa manual yang sesuai dengan versi server MySQL Anda untuk sintaks yang tepat untuk digunakan di dekat 'UNION pilih * dari aktor)' pada baris ", mengapa demikian?
jcho360
7
Tidak serumit kedengarannya .... Biarkan saja kunci utama duplikat dari kueri Anda .... ini berfungsi untuk saya!
Jawaban:
Anda juga bisa mencoba:
yang memungkinkan baris tersebut di tabel_1 untuk menggantikan baris di tabel_2 yang memiliki kunci utama yang cocok, sambil tetap menyisipkan baris dengan kunci utama baru.
Kalau tidak,
akan memperbarui baris yang sudah ada di table_1 dengan baris yang sesuai dari table_2, sambil menyisipkan baris dengan kunci primer baru.
sumber
Itu tergantung pada semantik kunci utama. Jika itu hanya autoincrement, maka gunakan sesuatu seperti:
Jika PK berarti sesuatu, Anda perlu menemukan cara untuk menentukan rekaman mana yang harus diprioritaskan. Anda dapat membuat kueri pemilihan untuk menemukan duplikat terlebih dahulu (lihat jawaban dengan cpitis ). Kemudian hilangkan yang tidak ingin Anda simpan dan gunakan sisipan di atas untuk menambahkan catatan yang tersisa.
sumber
sumber
Syntax error, unexpected IDENT_QUOTED
- melalui MySQL Workbench.Jika Anda perlu melakukannya secara manual, satu kali:
Pertama, gabungkan dalam tabel sementara, dengan sesuatu seperti:
Kemudian, identifikasi kendala kunci utama dengan sesuatu seperti
Di mana PK adalah bidang kunci utama ...
Pecahkan duplikat.
Ubah nama tabel.
[diedit - tanda kurung yang dihapus dalam kueri UNION, yang menyebabkan kesalahan pada komentar di bawah]
sumber
Tidak serumit kedengarannya .... Biarkan saja kunci utama duplikat dari kueri Anda .... ini berfungsi untuk saya!
sumber
Anda dapat menulis skrip untuk memperbarui FK untuk Anda .. lihat blog ini: http://multunus.com/2011/03/how-to-easily-merge-two-identical-mysql-databases/
Mereka memiliki skrip pintar untuk menggunakan tabel information_schema untuk mendapatkan kolom "id":
sumber