上一篇
场景引入:
小明正在开发一个电商后台系统,突然遇到需求:“用户每完成一次订单,就给他的积分字段+100”,他盯着屏幕挠头:“该用UPDATE
直接覆盖?还是先查询再计算?” 🤔 别急!这篇指南带你用最自然的方式玩转数据库字段加值操作~
UPDATE 表名 SET 字段名 = 字段名 + 增量值 WHERE 条件;
举个栗子 🌰:
-- 给用户ID为101的积分+100 UPDATE users SET points = points + 100 WHERE user_id = 101;
适用场景:MySQL、PostgreSQL、SQL Server等主流数据库
担心负数或溢出?可以加条件判断:
-- 只有当前积分≥0时才增加 UPDATE products SET stock = stock + 50 WHERE product_id = 200 AND stock >= 0;
高并发时可能出现脏读,推荐方案:
MySQL:用SELECT...FOR UPDATE
锁定行
BEGIN; SELECT points FROM users WHERE user_id = 101 FOR UPDATE; UPDATE users SET points = points + 100 WHERE user_id = 101; COMMIT;
PostgreSQL:直接原子操作
UPDATE users SET points = points + 100 WHERE user_id = 101 RETURNING points;
-- 根据用户等级决定加值量 UPDATE users SET points = points + CASE WHEN level = 'VIP' THEN 200 ELSE 100 END WHERE user_id IN (101, 102, 103);
// $inc操作符实现原子增加 db.users.updateOne( { _id: ObjectId("507f191e810c19729de860ea") }, { $inc: { points: 100 } } );
# 给键为user:101:points的值+100 INCRBY user:101:points 100
浮点数精度问题:
金融场景建议用DECIMAL
类型,避免FLOAT
计算误差
UPDATE accounts SET balance = balance + 999.99 WHERE account_no = '8888';
日志记录:
重要操作建议记录变更前后的值:
-- 先查询旧值 SELECT points INTO @old_points FROM users WHERE user_id = 101; -- 执行加值 UPDATE users SET points = points + 100 WHERE user_id = 101; -- 记录审计日志 INSERT INTO audit_log VALUES (NOW(), 101, @old_points, @old_points+100);
:字段加值就像给存钱罐投币 💰,关键要确保:
下次再遇到“给XX字段加值”的需求,不妨大喊一声:“UPDATE SET 字段=字段+N
,搞定!” 💪
(本文方法验证于2025年8月主流数据库版本)
本文由 权尔芙 于2025-08-09发表在【云服务器提供商】,文中图片由(权尔芙)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/573119.html
发表评论