UPDATE ... SET 多字段赋值

update afinfo set age=45 and birth=birth-YEAR(45) where name="陈晓";

------SQL 错误 1292 22001: Data truncation: Incorrect datetime value: '45'

SQL 语句存在多个语法和逻辑错误,导致了 Data truncation: Incorrect datetime value: '45' 错误。

错误原因拆解:
  1. SET 子句使用了错误的 AND UPDATE 语句中,多个字段赋值应该用 ** 逗号 ,** 分隔,而不是 AND。AND 是 WHERE 子句的逻辑运算符,写在 SET 里会被解析为逻辑判断,导致语法异常。

  2. birth=birth-YEAR(45) 是无效语法 YEAR() 函数需要传入一个日期 / 时间字段,而不是数字 45;birth-YEAR(...) 这种运算方式也完全错误,无法实现日期的加减。

  3. 数据类型错误 由于上述语法错误,MySQL 会错误地尝试将 45 作为日期时间值解析,因此报出了 Incorrect datetime value: '45' 错误。


✅ 正确的 SQL 语句

如果你的需求只是修改陈晓的年龄为 45,正确写法如下:

sql

复制代码
UPDATE ainfo 
SET age = 45 
WHERE name = '陈晓';

📌 进阶场景:同时更新年龄和出生日期

如果你的表中同时有 age 和 birth 字段,且需要让两者保持一致(比如设置年龄为 45 岁,自动更新出生日期),可以用以下两种方式实现:

方式 1:直接指定年龄,不更新出生日期

(推荐,除非业务强制要求维护两个冗余字段)

sql

复制代码
UPDATE ainfo 
SET age = 45 
WHERE name = '陈晓';
方式 2:设置年龄为 45 岁,自动推算出生日期

(假设当前年份为 2026 年,MySQL 环境)

sql

复制代码
UPDATE ainfo 
SET age = 45,
    birth = DATE_SUB(CURDATE(), INTERVAL 45 YEAR)
WHERE name = '陈晓';

💡 关键语法说明

  1. UPDATE ... SET 多字段赋值 多个字段之间必须用 ** 逗号 ,** 分隔,不能用 AND:

    sql

    复制代码
    -- 正确
    UPDATE table SET col1 = val1, col2 = val2 WHERE ...;
    -- 错误
    UPDATE table SET col1 = val1 AND col2 = val2 WHERE ...;
  2. 日期运算函数

    • CURDATE():获取当前日期(如 2026-05-06)
    • DATE_SUB(date, INTERVAL N YEAR):从指定日期减去 N 年
    • YEAR(date):获取日期的年份(如 YEAR('2026-05-06') 返回 2026)

🛠️ 常见避坑指南

  • 不要在 UPDATE 的 SET 子句中使用 AND 连接多个字段赋值。
  • age 和 birth 属于冗余字段,业务中建议只维护 birth,通过 TIMESTAMPDIFF(YEAR, birth, CURDATE()) 动态计算年龄,避免数据不一致。
  • 字符串类型的 name 值,需要用单引号 '陈晓' 包裹,部分数据库也支持双引号,但单引号兼容性更好。
相关推荐
ClickHouseDB2 小时前
ClickHouse Cloud 与 Snowflake 实时性价比对比:CostBench 测试中的 412 倍差距来
运维·数据库·系统架构
m0_639906942 小时前
Redis入门|五种数据结构、使用场景、持久化RDB&AOF
数据结构·数据库·redis
时间售卖铺3 小时前
触发器与函数实战:MySQL高效编程秘诀
运维·数据库·mysql·云原生
qetfw3 小时前
UOS MariaDB 数据库:安装、最小权限与备份验证
linux·数据库·mariadb·uos
数智园区合作社4 小时前
问数平台怎么把同一个指标锁成一个数
大数据·数据库·人工智能·ai
lbb 小魔仙4 小时前
Windows搭建PaddleOCR+飞书Webhook自动打卡通知机器人:识别、推送与远程触发完整教程
数据库·人工智能·prometheus·时序数据库
captain3765 小时前
MyBatis操作数据库(入门2)
java·数据库·spring boot·后端·spring·mybatis
心中有你02146 小时前
Java实现Dijkstra最短路径算法(邻接表 + 优先队列)
java·数据库·算法
龙亘川6 小时前
综合素质评价业务建模:从过程性评价到成长档案全链路闭环
数据库·智慧城市·数据可视化
数据库小组6 小时前
NineData 实战教程:MySQL 5.5 数据迁移同步到 MySQL 8.0(跨版本升级)
数据库·mysql·mysql优化·数据库开发·数据库迁移·版本升级·数据复制