有一个插入或更新的需求,记得在hibernate里面用过creatOrUpdate的方法,尝试着写一条sql解决这个问题,如下:
INSERT INTO 表 (字段1,字段2) VALUES (值1,值2) ON DUPLICATE KEY UPDATE 字段2=VALUES(字段2)
可是问过几个很有经验的人,都说这种方式不好。
各位大神能综合讲一下优劣吗?
有一个插入或更新的需求,记得在hibernate里面用过creatOrUpdate的方法,尝试着写一条sql解决这个问题,如下:
INSERT INTO 表 (字段1,字段2) VALUES (值1,值2) ON DUPLICATE KEY UPDATE 字段2=VALUES(字段2)
可是问过几个很有经验的人,都说这种方式不好。
各位大神能综合讲一下优劣吗?
不要用这些非典型sql语句(on duplicate...)
因为这些语句(我认为)增加维护成本并且无法清晰表达出你的目的,并且如果它不是sql在日后很可能会废弃。
正确的做法是自己写一份逻辑判断。
8 回答6.4k 阅读
5 回答3.3k 阅读✓ 已解决
3 回答3.7k 阅读✓ 已解决
1 回答4.1k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
2 回答3.2k 阅读
除非,有非常特殊的理由,否则不要使用这些乱七八糟的方法。
正确的更新一行数据的通用方法(通用的意思是对于所有主流的关系型数据库都可行):
1.查询并使用行级排他锁,把查询到的结果放入缓存。
2.对缓存做验证,处理掉结果数量为0与结果数量大于1的情况。
3.此时就只剩结果数量等于1的情况了。把结果的值取出,做提前验证。举例:假设值为金额,要对金额做减去1元的操作,此时就要验证金额是否大于1元。
4.对值做计算,并更新原值。
5.提交。