Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Panggilan UPSERT standar SQL

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.

  1. MULAI TRANSAKSI.
  2. PILIH ... UNTUK PEMBARUAN.
  3. Jika SELECT menemukan baris, maka UPDATE.
  4. Lain, MASUKKAN.
  5. 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();


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana saya memerlukan bidang mysql?

  2. PHP Coba dan Tangkap untuk SQL Insert

  3. Tidak dapat memuat plugin autentikasi 'caching_sha2_password'

  4. MySQL COUNT() di beberapa kolom

  5. Terhubung pada database MySQL jarak jauh melalui Python