java - sql 插入或更新的语句为什么不推荐使用?
天蓬老师
天蓬老师 2017-04-18 09:33:25
[Java讨论组]

有一个插入或更新的需求,记得在hibernate里面用过creatOrUpdate的方法,尝试着写一条sql解决这个问题,如下:

INSERT INTO 表 (字段1,字段2) VALUES (值1,值2) ON DUPLICATE KEY UPDATE 字段2=VALUES(字段2)

可是问过几个很有经验的人,都说这种方式不好。

各位大神能综合讲一下优劣吗?

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(4)
PHP中文网

除非,有非常特殊的理由,否则不要使用这些乱七八糟的方法。

正确的更新一行数据的通用方法(通用的意思是对于所有主流的关系型数据库都可行):

1.查询并使用行级排他锁,把查询到的结果放入缓存。

2.对缓存做验证,处理掉结果数量为0与结果数量大于1的情况。

3.此时就只剩结果数量等于1的情况了。把结果的值取出,做提前验证。举例:假设值为金额,要对金额做减去1元的操作,此时就要验证金额是否大于1元。

4.对值做计算,并更新原值。

5.提交。

PHPz

没什么不好的,只要你明白你自己在做什么,我用得多了。
有的数据库upsert操作只支持主键更新。

PHP中文网

不要用这些非典型sql语句(on duplicate...)
因为这些语句(我认为)增加维护成本并且无法清晰表达出你的目的,并且如果它不是sql在日后很可能会废弃。

正确的做法是自己写一份逻辑判断。

PHP中文网

很奇怪为什么有经验的人没有把这个问题说清楚,难道他们也没有什么充分的理由?

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号