MySQL如何为表新增列填充CASE语句计算的分类值
错误原因
当前写法存在两个核心问题:
- 语句用途选错:
INSERT的作用是向表中新增全新的行记录,无法给已经存在的行填充字段值。给现有行的新增列填充值属于更新操作,需要使用UPDATE语句。 - 语法逻辑错误:如果要通过查询结果插入数据,不需要加
VALUES关键字,直接接子查询即可,但即使修正语法,这个写法也会向表中插入一堆仅age_category字段有值、其余字段全为空的脏数据,完全不符合需求。
正确实现方式
直接执行UPDATE语句,根据每行的age值计算对应分类后赋值给age_category列即可:
UPDATE customer SET age_category = CASE WHEN age > 60 THEN 'old' WHEN age BETWEEN 30 AND 60 THEN 'middled age' WHEN age BETWEEN 20 AND 30 THEN 'young' WHEN age BETWEEN 13 AND 20 THEN 'teen' ELSE 'kid' END;
额外注意事项
- 新增列时写的
varchar没有指定长度,在MySQL等部分数据库中,会默认将字段长度设为1,导致middled age这类长字符串被截断。建议先调整字段长度再更新值:ALTER TABLE customer MODIFY COLUMN age_category varchar(20); - 当前CASE语句的区间是闭合边界:30岁会归为
middled age、20岁归为young、13岁归为teen,如果业务分类规则有不同的边界要求,自行调整WHEN后的判断条件即可。 - 更新完成后可以执行以下语句抽样验证结果是否符合预期:
SELECT age, age_category FROM customer LIMIT 20;
内容的提问来源于stack exchange,提问作者Talha Anwar
相关产品推荐
相关产品推荐

