【问题标题】:update field based on another field's updated value根据另一个字段的更新值更新字段
【发布时间】:2017-07-01 17:27:07
【问题描述】:

我有以下查询(不言自明):

update t
    set scans = scans + 1, 
        is_active = if(count = scans, 0, is_active)
where id = 123

最后scans 得到更新,实际上等于count,但is_active 仍然保留1

我希望每当扫描 = 计数时停用条目。

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    这就是应该发生的事情,according to the MySQL documentation

    如果您访问要在表达式中更新的表中的列,则 UPDATE 使用该列的当前值。例如,以下语句将 col1 设置为比其当前值大一:

    UPDATE t1 SET col1 = col1 + 1;

    以下语句中的第二个赋值将 col2 设置为当前(更新的)col1 值,而不是原始 col1 值。结果是 col1 和 col2 具有相同的值。此行为不同于标准 SQL。

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

    单表 UPDATE 分配通常从左到右进行评估。对于多表更新,不能保证分配按任何特定顺序执行。

    【讨论】:

    • 好吧,我认为这行不通,因为我需要比较扫描的更新值。我只是简化了对这个问题的查询。
    • 不管怎样,你正在用一些东西更新scans 的值,为什么不能在if 子句中减去相同的值进行比较?
    • 是的,但是想象计数是 3,扫描是 2 并进行第三次更新,现在新的扫描值应该是 3,你说,再次比较计数与 2 不是吗?
    • 我认为原因可能是因为我在事务中运行它,因为我在没有事务的情况下对其进行了测试并且它可以工作。你觉得呢?
    • 根据文档,我修改了答案,因为这是应该发生的事情。然而,即使是文档也不够模糊。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多