仅当值已更改时,如何插入数据库?

时间:2010-09-23 18:42:21

标签: mysql

我需要更新(替换)MySQL数据库中的字段,但前提是它们已经更改。

该表包含ID,文本字段和更改日期。用户根据ID更改的日期按ID查询数据。即如果日期在用户查询数据的最后时间之前,则他不想要它。

仅当文本字段与具有相同ID的现有文本字段不同时,我才想更改数据库中的日期。

我可以查询数据,比较结果,只有在新数据不同的情况下才回发,但这是一个很大的开销,数据库连接速度很慢,所以我正在寻找一种方法来做到这一点。单一查询。

谢谢。

4 个答案:

答案 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;

相关: MySQL Trigger after update only if row has changed

答案 3 :(得分:0)

我误解了你使用的@value标签,订单错了,你应该试试像:

UPDATE my_table
SET
    updated = (CASE WHEN foo <> 'new_value' THEN NOW() ELSE updated END),
    foo = 'new_value'
WHERE id = 11;