pierwsze, tutaj jest zwięzłe podsumowanie pytanie:MySQL INSERT IF (zwyczaj if)
Czy to możliwe, aby uruchomić oświadczenie INSERT
warunkowo? Coś podobnego do tego:
IF(expression) INSERT...
Teraz wiem, że mogę to zrobić z procedury przechowywanej. Moje pytanie brzmi: czy mogę to zrobić w moim zapytaniu?
Dlaczego miałbym to zrobić?
Załóżmy mamy następujące 2 stoliki.
products: id, qty_on_hand
orders: id, product_id, qty
Teraz, powiedzmy, że zamówienie na 20 Voodoo Dolls (identyfikator produktu 2) jest w
Najpierw sprawdź, czy jest wystarczająco ilość towaru:
SELECT IF(
(SELECT SUM(qty) FROM orders WHERE product_id = 2 ) + 20
<=
(SELECT qty_on_hand FROM products WHERE id = 2)
, 'true', 'false');
Następnie, jeśli wartość jest prawidłowa, uruchamiamy kwerendę INSERT
.
Jak dotąd tak dobrze.
Istnieje jednak problem z współbieżnością.
Jeśli 2 zamówienia przychodzą na dokładnie w tym samym czasie, mogą one czytać ilość w kasie zanim którykolwiek z nich podał zamówienie. Następnie złożą zamówienie, tym samym przekraczając qty_on_hand
.
Wróćmy do głównego pytania:
Czy to możliwe, aby uruchomić oświadczenie INSERT
warunkowo, tak, że możemy połączyć obie te kwerendy w jednym?
Szukałem wiele, a jedynym typem warunkowego oświadczenia INSERT
, które mogłem znaleźć, było ON DUPLICATE KEY
, co oczywiście nie ma tutaj zastosowania.
@Bohemian: Nie ma potrzeby stosowania dwóch instrukcji "SELECT". Wystarczy jeden. Spójrz na moją odpowiedź. :) – Shef
To prawda, ale próbowałem dopasować mój * ogólny * wzór. Podoba mi się twoja odpowiedź ... +1 – Bohemian
@Joseph Silber: Aby zrobić co ??? Gdzie jest to odejmowanie? Co odejmowanie ma wspólnego z normalizacją? : D Czy rozumiesz, że powyższe zapytanie składa się z dwóch instrukcji 'SELECT' w porównaniu do mojego, który działa z jednym? (Nic wbrew twojej odpowiedzi, albo ty, czeski). – Shef