3

我只是想替换 (update) DATEPRICE并且OLDPRICE当价格与我表中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

UPDATE如果MODELthe 相同但 the不同,则基本语法是 to PRICEOLDPRICE开启PRICE_UPDATE

*更新*

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

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

3 回答 3

2

MySQL 有一个专门用于此目的的REPLACE语句。

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

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

于 2012-04-20T18:24:02.113 回答
1

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

INSERT INTO..ON DUPLICATE KEY UPDATE顾名思义,会在表中插入一个新行,除非有重复行,在这种情况下,它将更新该行(而不是删除它并添加一个新行),这将使表的顺序相同。

于 2012-04-20T18:29:29.613 回答
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);
于 2012-04-20T19:37:24.713 回答