Mysql:ON DUPLICATE KEY UPDATE:仅在值发生变化时更新

时间:2018-04-23 08:46:40

标签: mysql sql

我有一个使用此查询的mysql表:

INSERT INTO `stats` (`id`, `shop`, `price`, `timestamp`)
VALUES (NULL, '$shop', '$price', 'timestamp') ON DUPLICATE KEY UPDATE price='$price'

商店专栏是独一无二的。 “Id”=主键。时间戳列由mysql更新:更新CURRENT_TIMESTAMP

Data in the dB:

row: id=1, shop=viacom, price=5, timestamp=1524183480

案例1:要插入的行:shop = viacom,price = 6 结果:现有行已更新

案例2:要插入的行:shop = viacom,price = 5(< - 价格未更改)  结果:现有行已更新

我想让案例2工作。我可以用php代码处理它,但我宁愿让Mysql做那个工作。有任何想法吗? (我尝试添加像$ shop = shop这样的Where子句)

2 个答案:

答案 0 :(得分:0)

由于shop列是一个UNIQUE键,你可以删除id列并使用下面的内容。

replace into stats (shop, price) values ('$shop', '$price')

如果商店已经存在,则价格会更新。否则将插入一个新的商店。这是你想要的吗?

答案 1 :(得分:0)

尝试手动更新timestamp列:

INSERT INTO `stats` (`shop`, `price`) VALUES ('$shop', '$price')
ON DUPLICATE KEY UPDATE price='$price', timestamp = NOW();

======

选项#2:

如果要在MySQL中执行此操作,请创建存储过程并从PHP代码调用存储过程。

CREATE PROCEDURE `createOrUpdatePrice` (ex_shop varchar(255),ex_price int(11))
BEGIN
declare occures tinyint(1);
SELECT COUNT(`shop`) into occures from `stats` WHERE shop = ex_shop;
IF occures = 0 Then
INSERT INTO `stats` (`id`, `shop`, `price`) VALUES (NULL, ex_shop, ex_price);
ELSE
UPDATE `stats` SET price = ex_price where shop = ex_shop;
END IF;
END