Saya memiliki sebuah tabel Pesanan yang memiliki Jumlah kolom. Selama check-in atau check out, kita perlu memperbarui bahwa Jumlah kolom per satu. Apakah ada cara untuk melakukan hal ini dalam satu tindakan atau kita harus mendapatkan nilai yang ada dan kemudian menambahkan atau minus satu di atas itu?
Pertanyaan lain adalah ketika kita menyisipkan baris baru, kita perlu memeriksa apakah data yang ada kemudian masukkan jika tidak, yang dua langkah, atau ada cara yang lebih baik untuk melakukan hal ini?
terima kasih,
Untuk jawaban yang pertama:
UPDATE Orders SET Quantity = Quantity + 1 WHERE ...
Untuk jawaban kedua:
Ada beberapa cara untuk melakukan hal ini. Karena anda tidak menentukan database, saya akan menganggap MySQL.
INSERT KE table SET x=1, y=2 ON DUPLICATE KEY UPDATE x=x+1, y=y+2
GANTI KE meja SET x=1, y=2
Mereka berdua dapat menangani pertanyaan anda. Namun, pertama sintaks yang memungkinkan lebih banyak fleksibilitas untuk memperbarui catatan bukan hanya menggantinya (sebagai yang kedua tidak).
Perlu diingat bahwa untuk investasi ada, pasti ada sebuah kunci yang UNIK didefinisikan...
Tunggal-langkah jawaban untuk pertanyaan pertama adalah dengan menggunakan sesuatu seperti:
update TBL set CLM = CLM + 1 where key = 'KEY'
Yang's sangat banyak single-instruksi cara melakukan hal itu.
Sedangkan untuk pertanyaan kedua, anda tidak't perlu untuk menggunakan DBMS yang spesifik SQL senam (seperti UPSERT
) untuk mendapatkan hasil yang anda inginkan. Ada's metode standar untuk melakukan update atau insert yang doesn't membutuhkan DBMS tertentu.
try:
insert into TBL (key,val) values ('xyz',0)
catch:
do nothing
update TBL set val = val + 1 where key = 'xyz'
Artinya, anda mencoba untuk melakukan penciptaan pertama. Jika itu's sudah ada, mengabaikan kesalahan. Jika tidak, anda membuat dengan nilai 0.
Kemudian lakukan update yang akan bekerja dengan baik atau tidak:
It's tidak satu instruksi namun, cukup mengejutkan, it's bagaimana kita've telah melakukan hal itu berhasil untuk waktu yang lama.
UPDATE Orders Order
SET Order.Quantity = Order.Quantity - 1
WHERE SomeCondition(Order)
Sejauh yang saya tahu tidak ada build-in mendukung untuk MENYISIPKAN-ATAU-UPDATE pada SQL. Saya sarankan untuk membuat stored procedure atau gunakan bersyarat query untuk mencapai hal ini. Di sini anda bisa menemukan koleksi solusi untuk database yang berbeda.
Jika pemahaman saya benar, update harus cukup sederhana. Saya hanya akan melakukan hal berikut.
UPDATE TABLE SET QUANTITY = QUANTITY + 1 and
UPDATE TABLE SET QUANTITY = QUANTITY - 1 where QUANTITY > 0
Anda mungkin perlu filter tambahan untuk update satu baris bukannya semua baris.
Untuk sisipan, anda dapat cache beberapa id yang unik terkait dengan catatan anda secara lokal dan memeriksa terhadap cache ini dan memutuskan apakah untuk menyisipkan atau tidak. Pendekatan alternatif adalah untuk selalu memasukkan dan memeriksa PK kesalahan pelanggaran dan mengabaikan karena ini adalah berlebihan menyisipkan.
@dotjoe Hal ini lebih murah untuk update dan check @@rowcount, lakukan insert setelah itu fakta.
Pengecualian adalah mahal && update lebih sering
Saran: Jika anda ingin menjadi uber performant dalam DAL, membuat front end lulus di sebuah ID unik untuk baris yang akan diperbarui, jika null menyisipkan.
Yang DALs harus MENTAH, dan tidak perlu khawatir tentang menjadi tanpa kewarganegaraan.
Jika anda membuat itu bernegara, Dengan indeks, anda tidak akan melihat perbedaan dengan SQL berikut vs 1 pernyataan. IF (select top 1 * bentuk x dimana PK=@ID) Menyisipkan lain update