2012-01-22 9 views
7

Tengo una base de datos MySQL que tiene dos tablas (en realidad muchas más). La primera tabla vincula el número de SKU de un producto a una ID arbitraria. Hay una segunda tabla que registra el inventario de fin de día para cada artículo basado en este ID. Cuando el inventario se cambia por razones distintas a las ventas, se coloca un registro en esta segunda tabla con un booleano configurado en falso. Esto me permite decir que este nuevo número no es válido como vector para las ventas anteriores, sino para las ventas del día siguiente.MySQL "REEMPLAZAR" utilizando un SELECCIONAR para seleccionar un campo

Hay un error de sintaxis en este código. Todavía soy un estudiante, y agradecería enormemente la ayuda para explicar cómo funcionaría este tipo de actualización. Sé que el primer valor debe provenir de la declaración de selección.

Aquí es mi declaración de MySQL actual:

REPLACE INTO sales (`itemID`, `date`, `qty`, `price`) 
VALUES ([itemID], CURDATE(), [qty], 0.00) 
SELECT itemID FROM item WHERE `sku` = [sku] 
+4

Así que, ¿cuál es tu pregunta? –

+0

Hay un error de sintaxis en la instrucción. Esperaba que alguien me dijera cómo formar la declaración correcta. He estado golpeando mi cabeza contra la pared en este caso. – psyklopz

Respuesta

16

Reemplazar funciona como inserto, excepto que si hay una fila con la misma clave que está intentando insertar, se eliminará en sustituir en vez de darle un error.

Puede especificar argumentos directamente:

REPLACE INTO sales(`item_id`, `date`, `qty`, `price`) 
VALUES(15, '2012-01-01`, 5, '120.00') 

o especificarlos mediante SELECT:

REPLACE INTO sales(`item_id`, `date`, `qty`, `price`) 
SELECT item_id, date, qty, price FROM sales_to_accept 
WHERE sales_id = 721 

Usted sin embargo no se pueden mezclar los dos tipos de sintaxis en una consulta.

Pero no hay nada que nos impida la adición de valores constantes como columnas para el SELECT:

REPLACE INTO sales(`item_id`, `date`, `qty`, `price`) 
SELECT item_id, CURDATE(), 5, '74.00' FROM item 
WHERE `sku` = 'something' 
+0

Gracias. Eso funciona genial! Esto es exactamente lo que necesitaba. – psyklopz

+0

Una palabra de advertencia para las personas futuras que tropiecen con esto. REEMPLAZAR INTO provoca todo tipo de infierno con AUTOINCREMENTO. Esta consulta es la que terminé usando INSERT INTO ON DUPLICATE KEY UPDATE con la opción sugerida 3 anterior. – psyklopz

1

Usted está tratando de hacer un reemplazo en una selecta y en el mismo comunicado. Si está intentando ejecutar esto utilizando un programa de algún tipo o simplemente ingresándolo en MySQL, si coloca un punto y coma después del ) al final de la sección de valores, lo tratará como 2 solicitudes separadas.

Si está ejecutando esto a través de PHP, tendrá que dividirlo en 2 instrucciones separadas.

REPLACE INTO sales (`itemID`, `date`, `qty`, `price`) 
VALUES ((SELECT itemID FROM item WHERE `sku` = [sku]), CURDATE(), [qty], 0.00) 
+0

No, esta no es mi pregunta. No estoy tratando de correr para separar las declaraciones. Estoy tratando de encontrar el 'itemID' en la tabla' item' que coincide con el 'sku' provisto. Luego reemplace las otras propiedades de este 'itemID' en la tabla' sales'. Esto debería ser una sola consulta. – psyklopz

+0

Así que está preguntando sobre una subselección, así que vea si esa consulta actualizada le funciona. –

+0

Gracias. Eso funciona genial! – psyklopz