You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MySQL单查询中批量更新多行并添加时间戳?

在MySQL中用单查询更新多行并添加时间戳(使用CASE表达式)

别担心,我马上把这两个需求结合起来给你讲明白——用CASE表达式实现单条查询更新多行,同时给dl_time列加上时间戳,一步到位。

首先,CASE表达式其实就是MySQL里的"条件分支"工具,用来给不同的行设置不同的更新值。结合UPDATE语句,就能做到一次更新多行不同的数据。再加上时间戳的设置,只需要在SET子句里多添一项就行。

基础示例:更新多行+统一设置时间戳

假设你有个表task_list,主键是task_id,要更新task_status列,同时给所有被更新的行的dl_time设为当前时间。代码可以这么写:

UPDATE task_list
SET 
  task_status = CASE 
    WHEN task_id = 101 THEN '已完成'
    WHEN task_id = 102 THEN '待处理'
    WHEN task_id = 103 THEN '已取消'
    ELSE task_status  -- 关键!没匹配到的行保持原状态,避免被设为NULL
  END,
  dl_time = CURRENT_TIMESTAMP  -- 给所有符合条件的行设置当前时间戳
WHERE task_id IN (101, 102, 103);  -- 限定更新范围,千万别漏了这个!

进阶:给特定行单独设置时间戳

如果你不想给所有更新的行都加时间戳,只想给部分行设置,那也可以把CASE表达式用到dl_time上:

UPDATE task_list
SET 
  task_status = CASE 
    WHEN task_id = 101 THEN '已完成'
    WHEN task_id = 102 THEN '待处理'
    WHEN task_id = 103 THEN '已取消'
    ELSE task_status
  END,
  dl_time = CASE
    WHEN task_id IN (101, 102) THEN CURRENT_TIMESTAMP  -- 只给101、102行更新时间
    ELSE dl_time  -- 其他行保持原时间不变
  END
WHERE task_id IN (101, 102, 103);

几个重要提醒

  • 一定要加WHERE子句:如果漏掉,会更新全表的所有行,大概率会搞出事故!
  • ELSE子句不能省:CASE里如果没写ELSE,没匹配到条件的行对应的列会被设为NULL,这几乎不是你想要的结果。
  • 时间戳函数:CURRENT_TIMESTAMP和NOW()在MySQL里效果一致,选哪个都行;如果你的dl_time列已经设置了ON UPDATE CURRENT_TIMESTAMP属性,那其实不用手动写,但手动设置更可控。

内容的提问来源于stack exchange,提问作者Meek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:39:22