发生这种情况是因为 ,除非您指定子句,否则LEFT OUTER JOIN
它将返回所有行。由于您没有指定任何修改时间戳的条件,它会在每一行上进行修改。dpuserapplication
WHERE
尝试添加条件:
UPDATE dpuserapplication t1
LEFT OUTER JOIN temp_userapplication t2
ON t1.username = t2.username
AND t1.applicationname = t2.applicationname
AND t1.groupname = t2.groupname
SET t1.userdeleted = CASE
WHEN t2.id IS NULL THEN 1
ELSE 0
END,
t1.createddate = CASE
WHEN t2.id IS NOT NULL THEN CURRENT_TIMESTAMP
ELSE t1.createddate
END;
看到这个小提琴。
在您发表评论后,如果您只想更新userdeleted
设置为 1 并且现在设置为 0 的行:
UPDATE dpuserapplication t1
LEFT OUTER JOIN temp_userapplication t2
ON t1.username = t2.username
AND t1.applicationname = t2.applicationname
AND t1.groupname = t2.groupname
SET t1.userdeleted = CASE
WHEN t2.id IS NULL THEN 1
ELSE 0
END,
t1.createddate = CASE
WHEN t2.id IS NOT NULL AND t1.userdeleted = 1 THEN CURRENT_TIMESTAMP
ELSE t1.createddate
END;
看到这个小提琴。
在这个小提琴中:
- u1 的 userdeleted = 1,但符合条件。其状态更改为 0,并更新日期。
- u2 的 userdeleted = 0,并且符合条件。其状态设置为 0(无更改),但日期未更新。
- u3 不符合条件,没有任何反应。