SQL zum Erhöhen oder Verringern einer Spalte für eine int-Spalte in einem Befehl

Ich habe eine Tabelle "Orders", die eine Quantity-Spalte hat. Beim Ein- oder Auschecken müssen wir diese Quantity-Spalte um eins aktualisieren. Gibt es eine Möglichkeit, dies in einer Aktion zu tun, oder müssen wir den vorhandenen Wert abrufen und dann einen hinzufügen oder minus eins darüber hinzufügen?

Eine andere Frage ist, wenn wir eine neue Zeile einfügen, müssen wir überprüfen, ob die gleichen Daten vorhanden dann einfügen, wenn nicht, das sind zwei Schritte, oder gibt es eine bessere Möglichkeit, dies zu tun?

dank,

Antwort auf "SQL zum Erhöhen oder Verringern einer Spalte für eine int-Spalte in einem Befehl " 6 von antworten

Um die erste zu beantworten:

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

Um die zweite zu beantworten:

Es gibt mehrere Möglichkeiten, dies zu tun. Da Sie keine Datenbank angegeben haben, gehe ich von MySQL aus.

  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

Beide können Ihre Frage bearbeiten. Die erste Syntax ermöglicht jedoch mehr Flexibilität, um den Datensatz zu aktualisieren, anstatt ihn einfach zu ersetzen (wie es die zweite tut).

Denken Sie daran, dass für beide vorhanden sein muss, muss ein UNIQUE-Schlüssel definiert werden...

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

Soweit ich weiß, gibt es keine Einbauunterstützung für INSERT-OR-UPDATE in SQL. Ich schlage vor, eine gespeicherte Prozedur zu erstellen oder eine bedingte Abfrage zu verwenden, um dies zu erreichen. Here you can find a collection of solutions for different databases. finden Sie eine Sammlung von Lösungen für verschiedene Datenbanken.

, um die zweite antworte:

machen die Spalte eindeutig und fangen die Ausnahme ab, wenn sie auf denselben Wert festgelegt ist.

Wenn mein Verständnis richtig ist, sollten Updates ziemlich einfach sein. Ich würde nur folgendes tun.

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

Möglicherweise benötigen Sie zusätzliche Filter, um nur eine einzelne Zeile anstelle aller Zeilen zu aktualisieren.

Bei Einfügungen können Sie lokal eine eindeutige ID zu Ihrem Datensatz zwischenspeichern und anhand dieses Caches überprüfen und entscheiden, ob Sie einfügen möchten oder nicht. Der alternative Ansatz besteht darin, immer einen PK-Verletzungsfehler einzufügen und zu überprüfen und zu ignorieren, da es sich um einen redundanten Einfügen handelt.

@dotjoe Es ist billiger, zu aktualisieren und zu überprüfen, @@rowcount, tun Sie eine Einfügung nach dann Tatsache.

Ausnahmen sind teuer && Updates sind häufiger

Vorschlag: Wenn Sie uber performant in Ihrem DAL sein möchten, machen Sie den Front-End-Pass in einer eindeutigen ID für die zeile aktualisiert werden, wenn null einfügen.

Die DALs sollten CRUD sein und sich keine Sorgen machen, staatenlos zu sein.

Wenn Sie es zustandslos machen, Bei guten Indizes, werden Sie keinen Diff mit der folgenden SQL vs 1-Anweisung sehen. Einfügen update

IF (wählen Sie oben 1 * Formular x, wo [email protected]) oder

Die einstufige Antwort auf die erste Frage ist, so etwas wie zu verwenden:

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

Das ist sehr viel eine einzige Anweisung, es zu tun.

Was die zweite Frage betrifft, sollten Sie nicht auf DBMS-spezifische SQL-Gymnastik (wie UPSERT) to get the result you want. There's a standard method to do update-or-insert that doesn't require a specific DBMS. ) zurückgreifen müssen, um das gewünschte Ergebnis zu erhalten. Es gibt eine Standardmethode zum Aktualisieren oder Einfügen, für die kein bestimmtes DBMS erforderlich ist.

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

Das heißt, Sie versuchen, die Kreation zuerst zu tun. Wenn es bereits vorhanden ist, ignorieren Sie den Fehler. Andernfalls erstellen Sie es mit einem Wert von 0.

Dann machen Sie das Update, das richtig funktioniert, ob oder nicht:

  • die Zeile ursprünglich existierte.
  • jemand aktualisierte es zwischen Ihrem Einfügen und Update.

Es ist keine einzige Anweisung und doch ist es überraschenderweise, wie wir es seit langem erfolgreich machen.