gpt4 book ai didi

MySQL 的 IF 语句和 TIMESTAMP 问题

转载 作者:行者123 更新时间:2023-11-29 00:30:45 25 4
gpt4 key购买 nike

我正在尝试进行具有以下行为的查询:

  • 如果 :id = NULL 则插入一个新行或 id = :id 所在的行尚不存在。
  • 如果 id = :id 所在的行更新现有行已经存在。
  • 设置 activated 的值到 NOW()如果:
    • status <> :status 的当前值. (又名。如果 status 的值将被更改)
    • :status = 'active' 的值. (也就是 status 的新值将是 'active' )

为了做到这一点,我做了以下准备声明:

INSERT INTO test
(`id`, `title`, `status`, `activated`)
VALUES
(:id, :title, :status, NULL)
ON DUPLICATE KEY UPDATE
id = LAST_INSERT_ID(id),
status = VALUES(status),
activated = IF(status <> VALUES(status) AND VALUES(status) = 'active',
NOW(), activated);

据我所知,这个语句准确地描述了所需的逻辑。但是,activated 的值始终保持不变,无论 status 的值是否为更改为 'active'还是不是。

谁能解释一下我做错了什么?并且(最好)解释如何修复它?

最佳答案

这个问题很不像 SQL,你在比较它之前分配状态;

status=VALUES(status),                                 -- assign so they're equal
activated=IF(status <> VALUES(status) AND -- compare, always equal
VALUES(status) = 'active', NOW(), activated);

只需反转分配,事情就可以正常进行。

INSERT INTO test
(`id`, `title`, `status`, `activated`)
VALUES
(:id, :title, :status, NULL)
ON DUPLICATE KEY UPDATE
id=LAST_INSERT_ID(id),
activated=IF(status <> VALUES(status) AND
VALUES(status) = 'active', NOW(), activated),
status=VALUES(status);

顺便说一句,您只需要分配实际更改的列,无需在更新时设置 id

关于MySQL 的 IF 语句和 TIMESTAMP 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16657820/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com