En primer lugar, aquí está el resumen sucinto de la pregunta:MySQL Insertar si (a medida, si las declaraciones)
¿Es posible ejecutar una sentencia condicional INSERT
? algo parecido a esto:
IF(expression) INSERT...
Ahora, sé que puedo hacer esto con un procedimiento almacenado. Mi pregunta es: ¿puedo hacer esto en mi consulta?
Ahora, ¿por qué querría hacer eso?
Supongamos que tenemos las siguientes 2 tablas:.
products: id, qty_on_hand
orders: id, product_id, qty
Ahora, supongamos que un pedido de 20 muñecas del vudú (producto ID 2) se presenta en
En primer lugar, comprobar si hay suficiente cantidad disponible:
SELECT IF(
(SELECT SUM(qty) FROM orders WHERE product_id = 2 ) + 20
<=
(SELECT qty_on_hand FROM products WHERE id = 2)
, 'true', 'false');
Entonces, si se evalúa como verdadera, se ejecuta una consulta INSERT
.
Hasta ahora todo bien.
Sin embargo, hay un problema con la concurrencia.
Si 2 pedidos llegan al exactamente el mismo horario, es posible que ambos lean la cantidad disponible antes de que cualquiera de ellos haya ingresado el pedido. Entonces ambos harán el pedido, excediendo así el qty_on_hand
.
Así que, volviendo a la raíz de la cuestión:
¿Es posible ejecutar una sentencia condicional INSERT
, por lo que podemos combinar estas dos consultas en una sola?
He buscado mucho, y el único tipo de declaración condicional INSERT
que pude encontrar fue ON DUPLICATE KEY
, que obviamente no se aplica aquí.
@Bohemian: No es necesario tener dos instrucciones 'SELECT'. Uno será suficiente. Eche un vistazo a mi respuesta. :) – Shef
Es cierto, pero estaba tratando de hacer coincidir mi patrón * general *. Aunque me gusta tu respuesta ... +1 – Bohemian
@Joseph Silber: ¿Para hacer qué? Donde esta la resta? ¿Qué tiene que ver la resta con la normalización? : D ¿Entiende que la consulta anterior se compone de dos declaraciones 'SELECT' en comparación con la mía, que se ejecuta con una? (Nada en contra de su respuesta, o usted, bohemio). – Shef