防止插入重复,是用数据库的唯一性约束好还是先去数据库查询存不存在好?

2016 年 9 月 27 日
 ZiLong
5955 次点击
所在节点    问与答
27 条回复
benatsh
2016 年 9 月 27 日
看你对系统的性能要求
murmur
2016 年 9 月 27 日
两个都要做,如果是注册的话肯定要 ajax 查一次用户重复不重复,然后防止捏造数据约束也得处理
xing393939
2016 年 9 月 27 日
数据库约束一下又不会怀孕
xss
2016 年 9 月 27 日
唯一约束.

你触发一次数据库查询.

如果是先查询在插入至少要 4 次网络 IO, 还可能会产生磁盘 IO
都是严重拖慢性能的东西.

当然,如果你的业务也就几千条数据,那么无所谓了~你用着爽就行.
ZiLong
2016 年 9 月 27 日
@benatsh 我是追求越高越好
ZiLong
2016 年 9 月 27 日
@murmur 针对这个场景,我可不可以加唯一性约束,直接插入数据库,通过捕获抛出的异常来判定是重复的呢
ZiLong
2016 年 9 月 27 日
@xss 明显是用唯一性约束爽噻,查数据库不写代码么
tairan2006
2016 年 9 月 27 日
肯定是唯一约束啊,你先查再插,要考虑并发问题啊,再来一个分布式锁?
xss
2016 年 9 月 27 日
@ZiLong 一般如果我消重的逻辑如果是先查数据库,在判断是否重复的话,我会把查询封装成一个通用函数,然后通过参数来改变查询函数的逻辑功能.你如果用唯一约束,就直接插,外面用异常给包住就行了.
vwhenx
2016 年 9 月 27 日
都要做
先去数据库查询是为了用户体验
据库的唯一性约束是为了保证数据一致性
Ouyangan
2016 年 9 月 27 日
@vwhenx 说的有道理
ZiLong
2016 年 9 月 27 日
@tairan2006 谢谢,一针见血
ZiLong
2016 年 9 月 27 日
@xss 我只是想比较两种方式的优缺点,具体怎么做,封不封装函数不关心
ZiLong
2016 年 9 月 27 日
@vwhenx @Ouyangan 查数据库为了用户体验的话,相当于这个场景很类似上面人提到的 ajax,比如 ajax 单独查用户名是否重复.不知道你说是否是这样的场景?我的意思是所有的字段都比如密码,生日这些都来了,然后要进行入库操作了,是先查询好,还是直接插入由数据库约束. @tairan2006 同学也提到了查询的并发问题,我觉得这提的很好.
Ouyangan
2016 年 9 月 27 日
@ZiLong 并发的问题实际上对应的是:数据库事务隔离级别 , java 的话 spring 有相应支持 .其他语言不熟悉.
akira
2016 年 9 月 27 日
单纯的先查再插是不能保证数据唯一的
约束是肯定要上的
个人更倾向于使用队列来处理类似的事情,除非量级过大或过小
ldbC5uTBj11yaeh5
2016 年 9 月 27 日
vwhenx
2016 年 9 月 27 日
@ZiLong 不一定非要用什么 ajax ,我自己用 ruby on rails, 可以在 Model 里面定义 validation ,在保存到数据库之前应该会自己去查一遍,如果重复,会给一个提示放在 session 里面返回回去。
mingyun
2016 年 9 月 27 日
唯一键, mysql 用 INSERT ... ON DUPLICATE KEY
sherlocktheplant
2016 年 9 月 27 日
用户名两样都要做
其他地方 只做数据库 然后处理好异常就可以

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/309293

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX