mysql - 当存储的版本与传递的参数不同时如何更新 MySQL 中的值

标签 mysql sql

UPDATE table SET x = :x, y = :y, z = IF(x <> :x, NOW(), z);

我需要检查旧的“x”的值是否与新的“x”不同。我无法在如上所示的 IF 语句中执行此操作,因为 x 的值已更改,因此它等于 :x

基本上,我想做的是:

IF(oldX <> :newX) THEN NOW() ELSE NO CHANGE;

有什么方法可以实现这一点,还是我最好使用子查询或变量来实现这一点? *我绝对更喜欢只执行一个查询。

最佳答案

MySQL 支持standard对此:

The second assignment in the following statement sets col2 to the current (updated) col1 value, not the original col1 value. The result is that col1 and col2 have the same value. This behavior differs from standard SQL.

UPDATE t1 SET col1 = col1 + 1, col2 = col1;

因此,以下内容适用于简单的 example在 SQL Fiddle 中:

UPDATE table
    SET x = if (@x := x, :x, :x),
        y = :y,
        z = IF(x <> @x, NOW(), z);

如果颠倒顺序,它也应该有效:

UPDATE table
    SET  z = IF(x <> :x, NOW(), z),
         x = :x,
         y = :y;

文档说单个表更新“通常”按词汇顺序处理。

关于mysql - 当存储的版本与传递的参数不同时如何更新 MySQL 中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21647330/

相关文章:

java - 面向对象语言(如 Java)中的嵌入式 SQL

sql - 指望同一张 table

php - Yii 模型关系 'on' 加入 yii 模型关系中的表的选项

php - 如何获取 "not in between these two dates"的查询结果

MySQL 连接条件与减法

mysql - SQL 使用 Count() 查找频率不是 MAX 的 ID

mysql - 更新 mysql 表中的行 - 行大小太大

php - 如何高效更新10万条记录的MySQL数据库

mysql - 当 2 个不同的行满足我的要求时返回共享列值

sql - 处理多维数据集时出错 : There is not enough space on the disk