我只想更换(更新)DATE
,PRICE
和OLDPRICE
,当价格不同于我的表中MODEL
唯一的PRICE时。
示例行表数据:
DATE | MAKE | MODEL | PRICE | OLDPRICE
2012-04-15 | Advance | DTA-100-X | 400 | 390
必须有十几种方法可以做到这一点,但我正在寻找在MySQL查询中使用的最佳解决方案。
我应该使用:
INSERT INTO..ON DUPLICATE KEY UPDATE
REPLACE INTO..
UPDATE...WHERE PRICE != XXX
如果UPDATE
相同但MODEL
不同,则基本语法为PRICE
; OLDPRICE
上的PRICE
成为UPDATE
*的 更新 *
这取代价格是否改变。如果价格发生变化,我只想要更新/替换,即,这不应该更新上面给出的任何内容,但是因为日期不同所以:
REPLACE INTO MyTable (DATE, MAKE, MODEL, PRICE, OLDPRICE) VALUES ('2012-10-02', 'Advance', 'DTA-100-X', '400', '390')
答案 0 :(得分:2)
MySQL专门用于此目的REPLACE
statement。
REPLACE的工作原理与INSERT完全相同,只是如果表中的旧行与PRIMARY KEY或UNIQUE索引的新行具有相同的值,则在插入新行之前删除旧行。
答案 1 :(得分:1)
如果您关心表格的顺序,请使用INSERT INTO..ON DUPLICATE KEY UPDATE
。 REPLACE
将删除旧行,然后添加新行,如果找到重复行。
INSERT INTO..ON DUPLICATE KEY UPDATE
会在表中插入一个新行,除非有重复内容,在这种情况下,它会更新行(而不是删除它并添加新行),这将使表的顺序相同。
答案 2 :(得分:0)
根据您的更新,您应该使用选项1,即upsert,又名INSERT...ON DULICATE KEY UPDATE
。
我认为你说你只想更新PRICE和OLDPRICE(不是DATE或MAKE),如果模型已经存在并且价格不同。如果是这种情况,这应该适合你:
像这样:
INSERT INTO MyTable (DATE, MAKE, MODEL, PRICE, OLDPRICE)
VALUES ('2012-10-02', 'Advance', 'DTA-100-X', '410', '390')
ON DUPLICATE KEY UPDATE OLDPRICE = CASE WHEN PRICE != VALUES(PRICE) THEN PRICE ELSE OLDPRICE END,
DATE = CASE WHEN PRICE != VALUES(PRICE) THEN VALUES(DATE) ELSE DATE END,
PRICE = VALUES(PRICE);