Saya memiliki pertanyaan berikut:
INSERT INTO table (a) VALUES (0)
ON DUPLICATE KEY UPDATE a=1
Saya ingin ID dari insert atau pembaruan. Biasanya saya menjalankan kueri kedua untuk mendapatkan ini karena saya percaya insert_id () hanya mengembalikan ID yang 'dimasukkan' dan bukan ID yang diperbarui.
Apakah ada cara untuk INSERT / UPDATE dan mengambil ID dari baris tanpa menjalankan dua query?
alter table tablename AUTO_INCREMENT = 0;
setelah permintaan di atas, untuk menghindari kesenjangan besar dalam nilai id Anda.Jawaban:
Lihat halaman ini: https://web.archive.org/web/20150329004325/https://dev.mysql.com/doc/refman/5.0/id/insert-on-duplicate.html
Di bagian bawah halaman mereka menjelaskan bagaimana Anda dapat membuat LAST_INSERT_ID bermakna untuk pembaruan dengan memberikan ekspresi ke fungsi MySQL itu.
Dari contoh dokumentasi MySQL:
sumber
Tepatnya, jika ini adalah permintaan asli:
dan 'id' adalah kunci utama kenaikan-otomatis daripada ini yang akan menjadi solusi yang berfungsi:
Semuanya ada di sini: http://dev.mysql.com/doc/refman/5.0/id/insert-on-duplicate.html
sumber
Anda mungkin melihat REPLACE, yang pada dasarnya adalah menghapus / menyisipkan jika catatan ada. Tetapi ini akan mengubah bidang kenaikan otomatis jika ada, yang dapat memutuskan hubungan dengan data lain.
sumber
Saya tidak tahu apa versi MySQL Anda tetapi dengan InnoDB, ada bug dengan autoinc
bug di 5.1.20 dan diperbaiki di 5.1.23 http://bugs.mysql.com/bug.php?id=27405
bug di 5.1.31 dan diperbaiki di 5.1.33 http://bugs.mysql.com/bug.php?id=42714
sumber
Saya telah menemukan masalah, ketika ON DUPLICATE KEY UPDATE id = LAST_INSERT_ID (id) menambah kunci primer dengan 1. Jadi id dari input selanjutnya dalam sesi akan bertambah 2
sumber
Perlu dicatat, dan ini mungkin jelas (tapi saya akan mengatakannya untuk kejelasan di sini), bahwa REPLACE akan menghilangkan baris pencocokan yang ada sebelum memasukkan data baru Anda. PADA UPDATE KUNCI DUPLICATE hanya akan memperbarui kolom yang Anda tentukan dan mempertahankan baris.
Dari manual :
sumber
Solusi yang ada berfungsi jika Anda menggunakan peningkatan otomatis. Saya memiliki situasi di mana pengguna dapat menetapkan awalan dan harus memulai ulang urutan pada 3000. Karena awalan yang bervariasi ini, saya tidak dapat menggunakan autoincrement, yang membuat last_insert_id kosong untuk dimasukkan. Saya menyelesaikannya dengan yang berikut:
Jika awalan ada, itu akan menambahnya dan mengisi last_insert_id. Jika awalan tidak ada, itu akan menyisipkan awalan dengan nilai 3000 dan mengisi last_insert_id dengan 3000.
sumber