Saya memiliki tabel Pesanan yang memiliki kolom Kuantitas. Saat check in atau check out, kami perlu memperbarui kolom Kuantitas itu satu per satu. Apakah ada cara untuk melakukan ini dalam satu tindakan atau kita harus mendapatkan nilai yang ada dan kemudian menambahkan atau minus satu di atasnya?
Pertanyaan lain adalah ketika kita memasukkan baris baru, apakah kita perlu memeriksa apakah ada data yang sama lalu masukkan jika tidak ada, yang merupakan dua langkah, atau adakah cara yang lebih baik untuk melakukan ini?
Terima kasih,
Jawaban satu langkah untuk pertanyaan pertama adalah dengan menggunakan sesuatu seperti:
Itu merupakan cara instruksi tunggal untuk melakukannya.
Adapun pertanyaan kedua, Anda tidak perlu menggunakan senam SQL khusus DBMS (seperti
UPSERT
) untuk mendapatkan hasil yang Anda inginkan. Ada metode standar untuk melakukan update-or-insert yang tidak memerlukan DBMS tertentu.Artinya, Anda mencoba melakukan penciptaan terlebih dahulu. Jika sudah ada, abaikan kesalahannya. Jika tidak, Anda membuatnya dengan nilai 0.
Kemudian lakukan update yang akan bekerja dengan benar apakah:
Ini bukan instruksi tunggal, namun, yang cukup mengejutkan, ini adalah cara kami melakukannya dengan sukses untuk waktu yang lama.
sumber
Jika pemahaman saya benar, pembaruan seharusnya cukup sederhana. Saya hanya akan melakukan hal berikut.
Anda mungkin memerlukan filter tambahan untuk memperbarui satu baris, bukan semua baris.
Untuk sisipan, Anda dapat menyimpan beberapa id unik yang terkait dengan catatan Anda secara lokal dan memeriksa cache ini dan memutuskan apakah akan menyisipkan atau tidak. Pendekatan alternatifnya adalah selalu menyisipkan dan memeriksa kesalahan pelanggaran PK dan mengabaikannya karena ini adalah penyisipan yang berlebihan.
sumber
Sejauh yang saya tahu tidak ada built-in dukungan untuk INSERT-OR-UPDATE di SQL. Saya menyarankan untuk membuat prosedur tersimpan atau menggunakan kueri bersyarat untuk mencapai ini. Di sini Anda dapat menemukan kumpulan solusi untuk database yang berbeda.
sumber
untuk menjawab yang kedua:
buat kolom unik dan tangkap pengecualian jika disetel ke nilai yang sama.
sumber
@dotjoe Lebih murah untuk memperbarui dan memeriksa @@ rowcount, lakukan penyisipan setelah fakta.
Pengecualian mahal && update lebih sering
Saran: Jika Anda ingin menjadi uber performant di DAL Anda, buat front end pass dalam ID unik untuk baris yang akan diperbarui, jika sisipan null.
DAL harus CRUD, dan tidak perlu khawatir menjadi stateless.
Jika Anda menjadikannya stateless, Dengan indeks yang baik, Anda tidak akan melihat perbedaan dengan pernyataan SQL vs 1 berikut. IF (pilih top 1 * form x dimana PK = @ ID) Masukkan update lain
sumber