Satu-satunya solusi yang didukung oleh MySQL dan HSQLDB adalah menanyakan baris yang ingin Anda ganti, dan dengan syarat INSERT atau UPDATE. Ini berarti Anda harus menulis lebih banyak kode aplikasi untuk mengimbangi perbedaan antara implementasi RDBMS.
- MULAI TRANSAKSI.
- PILIH ... UNTUK PEMBARUAN.
- Jika SELECT menemukan baris, maka UPDATE.
- Lain, MASUKKAN.
- KOMITMEN.
MySQL tidak mendukung pernyataan ANSI SQL MERGE. Mendukung REPLACE dan INSERT...ON DUPLICATE KEY UPDATE. Lihat jawaban saya untuk " INSERT IGNORE" vs "INSERT ... ON DUPLICATE KEY UPDATE" untuk lebih lanjut tentang itu.
Komentar Re:Ya, pendekatan lain adalah dengan mencoba INSERT dan melihat apakah itu berhasil. Jika tidak, lakukan UPDATE. Jika Anda mencoba INSERT dan menekan kunci duplikat, itu akan menghasilkan kesalahan, yang berubah menjadi pengecualian di beberapa antarmuka klien. Kerugian melakukan ini di MySQL adalah menghasilkan ID kenaikan otomatis baru bahkan jika INSERT gagal. Jadi Anda berakhir dengan kesenjangan. Saya tahu celah dalam urutan kenaikan otomatis biasanya bukan sesuatu yang perlu dikhawatirkan, tetapi saya membantu pelanggan tahun lalu yang memiliki celah 1000-1500 di antara penyisipan yang berhasil karena efek ini, dan hasilnya adalah mereka menghabiskan rentang waktu INT di kunci utama mereka.
Seperti yang dikatakan @baraky, seseorang dapat mencoba UPDATE terlebih dahulu, dan jika itu memengaruhi nol baris, maka lakukan INSERT sebagai gantinya. Komentar saya tentang strategi ini adalah bahwa memperbarui baris nol bukanlah pengecualian -- Anda harus memeriksa "jumlah baris yang terpengaruh" setelah PEMBARUAN untuk mengetahui apakah "berhasil" atau tidak.
Tetapi menanyakan jumlah baris yang terpengaruh mengembalikan Anda ke masalah awal:Anda harus menggunakan kueri yang berbeda di MySQL versus HSQLDB.
HSQLDB:
CALL DIAGNOSTICS(ROW_COUNT);
MySQL:
SELECT ROW_COUNT();