SQL bir komutta bir int sütunu için nasıl artırılır veya azaltılır


119

Miktar sütunu olan bir Siparişler tablom var. Giriş veya çıkış sırasında, bu Miktar sütununu birer birer güncellememiz gerekir. Bunu tek bir eylemde yapmanın bir yolu var mı, yoksa mevcut değeri alıp üstüne bir eklemeli mi yoksa eksi mi almalıyız?

Başka bir soru, yeni bir satır eklediğimizde, aynı verilerin mevcut olup olmadığını kontrol edip sonra eklememiz gerekiyor mu, bu iki adım mı, yoksa bunu yapmanın daha iyi bir yolu var mı?

Teşekkürler,

Yanıtlar:


250

İlki cevaplamak için:

UPDATE Orders SET Quantity = Quantity + 1 WHERE ...

İkinciye cevap vermek için:

Bunu yapmanın birkaç yolu var. Bir veritabanı belirtmediğiniz için, MySQL'i varsayacağım.

  1. INSERT INTO table SET x=1, y=2 ON DUPLICATE KEY UPDATE x=x+1, y=y+2
  2. REPLACE INTO table SET x=1, y=2

Sorunuzu ikisi de halledebilir. Bununla birlikte, ilk sözdizimi, kaydı yalnızca değiştirmek yerine güncellemek için daha fazla esneklik sağlar (ikincisinde olduğu gibi).

Her ikisinin de var olması için, EŞSİZ bir anahtarın tanımlanması gerektiğini unutmayın ...


32
Bir veritabanı belirtmediğiniz için, gerçekten standart SQL varsaymalısınız.
paxdiablo

12

İlk sorunun tek adımlı cevabı şuna benzer bir şey kullanmaktır:

update TBL set CLM = CLM + 1 where key = 'KEY'

Bu, bunu yapmanın tek talimatlı bir yolu.

İkinci soruya gelince, istediğiniz UPSERTsonucu elde etmek için DBMS'ye özgü SQL jimnastiğine (benzeri ) başvurmanıza gerek yoktur. Belirli bir DBMS gerektirmeyen güncelleme veya ekleme yapmanın standart bir yöntemi vardır.

try:
    insert into TBL (key,val) values ('xyz',0)
catch:
    do nothing
update TBL set val = val + 1 where key = 'xyz'

Yani önce yaratmayı yapmaya çalışırsınız. Zaten oradaysa, hatayı dikkate almayın. Aksi takdirde 0 değeriyle oluşturursunuz.

Ardından, aşağıdaki durumlara bakılmaksızın doğru çalışacak güncellemeyi yapın:

  • satır başlangıçta vardı.
  • ekleme ve güncelleme arasında birisi onu güncelledi.

Bu tek bir talimat değil ve yine de şaşırtıcı bir şekilde, uzun zamandır bunu başarılı bir şekilde nasıl yaptığımızdır.


4

Anladığım kadarıyla, güncellemeler oldukça basit olmalı. Ben sadece aşağıdakileri yapardım.

UPDATE TABLE SET QUANTITY = QUANTITY + 1 and
UPDATE TABLE SET QUANTITY = QUANTITY - 1 where QUANTITY > 0

Tüm satırlar yerine tek bir satırı güncellemek için ek filtrelere ihtiyacınız olabilir.

Eklemeler için, kaydınızla ilgili bazı benzersiz kimlikleri yerel olarak önbelleğe alabilir ve bu önbelleği kontrol edebilir ve ekleyip eklemeyeceğinize karar verebilirsiniz. Alternatif yaklaşım, her zaman PK ihlali hatasını eklemek ve kontrol etmek ve bu fazladan bir ekleme olduğundan yok saymaktır.


4
UPDATE Orders Order
SET Order.Quantity =  Order.Quantity - 1
WHERE SomeCondition(Order)

Bildiğim kadarıyla SQL'de INSERT-OR-UPDATE için yerleşik destek yok. Bunu başarmak için saklı bir prosedür oluşturmanızı veya koşullu bir sorgu kullanmanızı öneririm. Burada farklı veritabanları için bir çözüm koleksiyonu bulabilirsiniz.


Ayrılmış SİPARİŞ kelimesini bu şekilde fırlatırken bir sözdizimi hatası alabilirsiniz ...
gahooa

0

ikinciye cevap vermek için:

sütunu benzersiz yapın ve aynı değere ayarlanmışsa istisnayı yakalayın.


0

@dotjoe @@ rowcount'u güncellemek ve kontrol etmek daha ucuzdur, daha sonra bir ekleme yapın.

İstisnalar pahalıdır ve güncellemeler daha sıktır

Öneri: DAL'nizde uber performans sergilemek istiyorsanız, boş ekleme ise, güncellenecek satır için ön uç geçişini benzersiz bir kimlik yapın.

DAL'ler CRUD olmalıdır ve vatansız olma konusunda endişelenmenize gerek yoktur.

Durumsuz yaparsanız, İyi indekslerle, aşağıdaki SQL vs 1 ifadesinde bir fark görmezsiniz. IF (ilk 1 * form x'i seçin, burada PK = @ ID) Başka güncelleme ekle

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.