MySQL INSERT IF (benutzerdefinierte if-Anweisungen)
Erste, hier ist die kurze Zusammenfassung der Frage:
Ist es möglich, eine INSERT
Anweisung bedingt?
So etwas wie dieses:
IF(expression) INSERT...
Nun, ich weiß, ich kann dies tun mit einer gespeicherten Prozedur.
Meine Frage ist: kann ich dies in meine Abfrage?
Nun, warum sollte ich das tun wollen?
Nehmen wir an, wir haben folgende 2 Tabellen:
products: id, qty_on_hand
orders: id, product_id, qty
Nun, sagen wir, einen Auftrag für 20 Voodoo-Puppen (Produkt-id 2).
Zuerst prüfen wir, ob es reicht, Menge Auf der Hand:
SELECT IF(
( SELECT SUM(qty) FROM orders WHERE product_id = 2 ) + 20
<=
( SELECT qty_on_hand FROM products WHERE id = 2)
, 'true', 'false');
Dann, wenn es zu true ausgewertet wird, führen wir eine INSERT
Abfrage.
So weit So gut.
Allerdings gibt es ein problem mit der Gleichzeitigkeit.
Wenn 2 Bestellungen kommen in der genau die gleiche Zeit, könnten Sie sowohl Lesen als die Menge-auf-hand, bevor einer von Ihnen hat den Auftrag eingegeben hat.
Sie werden dann sowohl die Bestellung aufgeben, damit die überschreitung der qty_on_hand
.
So, zurück an die Wurzel der Frage:
Ist es möglich, eine INSERT
Anweisung bedingt, so dass wir kombinieren diese beiden Abfragen in einer?
Ich suchte viel herum, und die einzige Art der bedingten INSERT
Aussage, die ich finden konnte, war ON DUPLICATE KEY
die offensichtlich gilt hier nicht.
InformationsquelleAutor der Frage Joseph Silber | 2011-07-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn keine Zeilen zurückgegeben werden, wählen Sie (wegen Ihres besonderen Bedingung false ist) nicht einfügen passiert.
Mit Ihrem schema von Frage (vorausgesetzt, Ihr
id
Spalte istauto_increment
):Diese fügt keine Zeilen, wenn es nicht genügend Bestand auf der hand, sonst wird es schaffen, die um Zeile.
Nette Idee, btw!
InformationsquelleAutor der Antwort Bohemian
Versuchen:
Wenn ein Produkt mit
id
gleich2
vorhanden ist und dieqty_on_hand
größer oder gleich20
für dieses Produkt, dann ein insert auftreten wird, mit den Wertenproduct_id = 2
undqty = 20
. Ansonsten, werden keine insert-auftreten.Hinweis: Wenn Sie Ihre Produkt-ids beachten Sie einzigartige, möchten Sie vielleicht eine
LIMIT
- Klausel am Ende derSELECT
- Anweisung.InformationsquelleAutor der Antwort Shef
Du bist wahrscheinlich der Lösung des Problems der falsche Weg.
Wenn du Angst hast zwei lese-Operationen werden zur gleichen Zeit auftreten und somit ein arbeiten mit veralteten Daten, die Lösung ist sperren oder Transaktionen.
Habe die Abfrage so machen:
InformationsquelleAutor der Antwort Konerak
Nicht sicher über die Parallelität, die Sie brauchen, um zu Lesen, zu sperren in mysql, aber das lässt Sie sicher sein, dass man nur 20 Artikel 20 Artikel stehen zur Verfügung:
Können Sie dann überprüfen, wie viele Zeilen betroffen waren. Wenn keiner betroffen waren, Sie hatten nicht genug auf Lager. Wenn 1 Zeile betroffen war, haben Sie effektiv verbraucht den Vorrat.
InformationsquelleAutor der Antwort My Other Me