2013-04-11 5 views
0

У меня есть базы данных MySQL для коммерции сайта веб-с ценовой таблицы, которая выглядит следующим образом:INSERT INTO .... Несколько строк ... На Дублированный Key

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

Это позволяет пункты иметь различные уровни ценообразования либо на основе membershipid, либо quantity (но здесь значение всегда будет 1).

мне нужно обновить это с исходной таблицы, как:

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

Я не знаю, как вставить данные:

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

( п = ID на новой вставке, или PK Update, если он уже существует)

Я знаю, что следующий код не будет работать, но по существу, мне нужно сделать следующее:

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); 

Мне нужны три разных строки, каждый с одинаковым [productid], но отличается [priceid, membershipid, price].


Я искал ответы и несколько дней стучал головой о стол. Любые идеи? Любая помощь будет очень оценен.

ответ

0
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. 
+0

Мне очень жаль, но это трудно для меня, чтобы расшифровать то, что вы имеете в виду в первом способе. После удаления AI я буду запускать это 3 раза, каждый с другим идентификатором membershipID? : REPLACE INTO mysql.pricing (priceid, prouductid, memberid, количество, цена) SELECT priceid, productid, 1, 1, priceA от mysql.source – luxdvie

Смежные вопросы