먼저, 여기에 문제의 간결한 요약이다 :MySQL은 INSERT IF (if 문 정의)
이 가능 조건부 INSERT
문을 실행하는가? 이 가깝다 뭔가 :
IF(expression) INSERT...
지금, 내가 저장 프로 시저와 함께이 작업을 수행 할 수 있습니다 알고 있습니다. 내 질문에 : 내 쿼리에서이 작업을 수행 할 수 있습니까?
지금 내가 왜 그렇게하고 싶습니까?
의 우리는 다음과 같은 두 테이블이 있다고 가정하자.의 20 개 부두 인형 (제품 ID 2)에 대한 주문이 들어오는 말을하자, 이제
products: id, qty_on_hand
orders: id, product_id, qty
을 충분한 수량이 손에있을 경우
우리는 먼저 확인 : 이 true로 평가되면
SELECT IF(
(SELECT SUM(qty) FROM orders WHERE product_id = 2 ) + 20
<=
(SELECT qty_on_hand FROM products WHERE id = 2)
, 'true', 'false');
그런 다음, 우리는
INSERT
쿼리를 실행합니다.
지금까지 너무 좋아.
그러나 동시성에는 문제가 있습니다.
정확히 같은 시간에 2 주문이 들어 오면, 주문 중 하나가 주문에 들어가기 전에 양 수량을 모두 읽을 수도 있습니다. 둘 다 주문을하게되며 따라서 qty_on_hand
을 초과합니다. 그래서 다시 질문의 루트에
:
우리가 하나에 이러한 쿼리를 모두 결합 할 수 있도록 조건부 INSERT
문을 실행할 수 있습니까?
내가 많이 찾을 수있는 조건문 INSERT
의 진술은 ON DUPLICATE KEY
이며 여기서는 분명히 적용되지 않습니다.
@ 보헤미안 : 두 개의 SELECT 문 필요 없음. 하나는 충분할 것입니다. 내 대답 좀 봐. :) – Shef
사실,하지만 내 * 일반 * 패턴과 일치 시키려고했습니다. 나는 당신의 대답을 좋아합니다 ... +1 – Bohemian
@Joseph Silber : 무엇을 할 ??? 거기에서 뺄셈은 어디에 있습니까? 뺄셈은 정규화와 어떤 관련이 있습니까? : D 위의 쿼리가 내 것과 비교되는 두 개의 SELECT 문으로 구성된다는 것을 알고 계십니까? (당신의 대답이나 당신, 보헤미안에 대한 어떤 것도). – Shef