INSERTAR EN... Múltiples filas... En clave duplicada

Tengo una base de datos mysql para un sitio de comercio web con una tabla de precios que se ve así:

priceid (int, PK, AI)
productid (int)
membershipid (int)
price (decimal(12,2))
quantity (int)

Esto permite que los artículos tengan diferentes niveles de precios basados ​​en membershipid or quantity (pero aquí el valor siempre será 1).

Necesito actualizar esto con una tabla fuente como:

productid (int,PK)
price1 (int)
price2 (int)
price3 (int)

No estoy seguro de cómo insertar los datos:

COLS:[productid, price, membershipid, quantity][priceid]
ROWS:[productid, price1, 1, 1][n]
ROWS:[productid, price2, 2, 1][n]
ROWS:[productid, price3, 5, 1][n]

(n = ID en el nuevo inserto o actualización de PK si ya existe)

Sé que el siguiente código no funcionará, pero esencialmente, lo que debo hacer es esto:

INSERT INTO mysql.pricing
    (prouductid, membershipid, quantity, price) 
SELECT productid, 1, 1, price1 from mysql.source 'row n
SELECT productid, 2, 1, price2 from mysql.source 'row n+1
SELECT productid, 5, 1, price3 from mysql.source 'row n+2
ON DUPLICATE KEY UPDATE productid = VALUES(productid),membershipid = VALUES(membership), quantity = VALUES(quantity), price = VALUES(price);

Necesito tres filas distintas, cada una con el mismo [id de producto], pero diferentes [id de precio, ID de membresía, precio].


He buscado respuestas y me he estado golpeando la cabeza contra un escritorio durante días. ¿Algunas ideas? cualquier ayuda seria muy apreciado.

preguntado el 11 de abril de 13 a las 04:04

1 Respuestas

You have mentioned priceid (int, PK, AI)-  You can use on duplicate key update in     primary key but not on Auto Increment.  

There are two ways to solve this:  
Remove only Auto Increment from priceid and set the field as     (productid,membershipid,pricenumber) eg:  
Membershipid = 2   
productid = 33   
price1 = 11   
price2 = 12  
price3 = 13  
**priceid will be**  
33211 (price 1)  
33212 (price 2)  
33213 (price 3)  

This will always be unique...(for primary key), updating the following info.  
for memebershipid 2 , productid 33, price1 = 25, price2 = 28, price3 = 30

insert will be as follows (priceid,membershipid,productid,price,quantity)  

replace into mysql.pricing values(33211,33,2,25,1);
replace into mysql.pricing values(33222,33,2,28,1);
replace into mysql.pricing values(33233,33,2,30,1);

if the price2 has been changed from 28 to 29 you insert statment will be like this.

replace into mysql.pricing values(33222,33,2,29,1);

(using replace instead of insert for update incase of already existing primary key) 

or

other way is add another column in you mysql.pricing table with datetime, and priceid     will be primarykey  & autoincrement

mysql table columns 
priceid (int, PK, AI),productid (int),membershipid (int) price(decimal(12,2)),quantity     (int),insert_date (datetime)

Above insert can be inserted as following using now() function (which returns current     date& time)  

insert into mysql.pricing values(33,2,25,1,now());
insert into mysql.pricing values(33,2,28,1,now());
insert into mysql.pricing values(33,2,30,1,now());

updating  price2 (it will always be insert)  

insert into mysql.pricing values(33,2,29,1,now());

make all  fetch result based on max insert_date(datetime field) for respective     membershipid,price1/price2..  
Hope this solves your problem. 

Respondido 11 Abr '13, 06:04

Lo siento, pero es difícil para mí descifrar lo que quieres decir con el primer método. Después de eliminar AI, ejecutaría esto 3 veces, cada una con un ID de membresía diferente. : REEMPLAZAR EN mysql.pricing (id de precio, id de producto, id de membresía, cantidad, precio) SELECCIONE id de precio, id de producto, 1, 1, precioA de mysql.source - luxdvie

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.