我需要更新(替换)MySQL数据库中的字段,但前提是它们已经更改。
该表包含ID,文本字段和更改日期。用户根据ID更改的日期按ID查询数据。即如果日期在用户查询数据的最后时间之前,则他不想要它。
仅当文本字段与具有相同ID的现有文本字段不同时,我才想更改数据库中的日期。
我可以查询数据,比较结果,只有在新数据不同的情况下才回发,但这是一个很大的开销,数据库连接速度很慢,所以我正在寻找一种方法来做到这一点。单一查询。
谢谢。
答案 0 :(得分:3)
您可以在更新查询中包含CASE语句,该语句将有条件地设置日期字段,如下所示:
UPDATE MyTable
SET textfield = @newValue,
datefield = (CASE WHEN textfield <> @newValue THEN NOW() ELSE datefield END);
如果datefield
的值未更改,此查询会将textfield
“设置”为已包含的相同值。
答案 1 :(得分:0)
我想你在这里回答了你自己的问题:
如果文本字段与具有相同ID的现有文本字段不同
换句话说,使用MySQL CASE语句检查文本字段是否不同。如果是,请在文本字段和日期上进行更新。如果没有,请不要进行任何更新。
或者,您可以在代码中进行相同的检查,这将减少数据库的访问次数。这可能会缓解数据库连接速度缓慢的问题。
答案 2 :(得分:0)
当问到这个问题时可能不存在的简单方法:
CREATE TRIGGER `TimeTrigger` BEFORE UPDATE ON `MyTable`
FOR EACH ROW
BEGIN
SET NEW.lastUpdate = (CASE WHEN NEW.text <> OLD.text THEN NOW() ELSE NEW.lastUpdate END);
END;
答案 3 :(得分:0)
我误解了你使用的@value标签,订单错了,你应该试试像:
UPDATE my_table
SET
updated = (CASE WHEN foo <> 'new_value' THEN NOW() ELSE updated END),
foo = 'new_value'
WHERE id = 11;