不重复行时插入?

时间:2012-04-20 18:23:05

标签: mysql insert replace upsert

我只想更换(更新)DATEPRICEOLDPRICE,当价格不同于我的表中MODEL唯一的PRICE时。

示例行表数据:

DATE        |   MAKE   |   MODEL   |   PRICE   |   OLDPRICE
2012-04-15  | Advance  | DTA-100-X |   400     |   390

必须有十几种方法可以做到这一点,但我正在寻找在MySQL查询中使用的最佳解决方案。

我应该使用:

  1. INSERT INTO..ON DUPLICATE KEY UPDATE
  2. REPLACE INTO..
  3. UPDATE...WHERE PRICE != XXX
  4. 如果UPDATE相同但MODEL不同,则基本语法为PRICE; OLDPRICE上的PRICE成为UPDATE

    *的 更新 *

    这取代价格是否改变。如果价格发生变化,我只想要更新/替换,即,这不应该更新上面给出的任何内容,但是因为日期不同所以:

    REPLACE INTO MyTable (DATE, MAKE, MODEL, PRICE, OLDPRICE) VALUES ('2012-10-02', 'Advance', 'DTA-100-X', '400', '390')
    

3 个答案:

答案 0 :(得分:2)

MySQL专门用于此目的REPLACE statement

  

REPLACE的工作原理与INSERT完全相同,只是如果表中的旧行与PRIMARY KEY或UNIQUE索引的新行具有相同的值,则在插入新行之前删除旧行。

- http://dev.mysql.com/doc/refman/5.6/en/replace.html

答案 1 :(得分:1)

如果您关心表格的顺序,请使用INSERT INTO..ON DUPLICATE KEY UPDATEREPLACE删除旧行,然后添加新行,如果找到重复行。

顾名思义,

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