Mysql 多个字段有唯一约束,写入时如果有重复的,如何知道哪个字段重复了?

2018-06-19 20:51:40 +08:00
 mostkia

RT。。我是通过 PHP 的 pdo 方式来获取 mysql 的返回值的。其实也没什么特殊的使用场景,就是想写一个注册功能,注册时让用户知道是哪个参数重复了(比如用户名、电话、邮箱)等这些不允许重复的字段。因为默认 mysql 只会返回 23000 错误码,并不会返回具体哪一个字段重复了。

考虑过先 select 多条件查找,发现了后返回给 php 提示用户,如果没发现有重复的内容则再使用 php 访问数据库写入,但这样就访问了数据库 2 次了,对性能不太友好,也不优雅。可能是我比较笨吧,想来想去没什么好办法。

原谅我只是个前端,对 sql 只会简单的读写。虚心请教一下,是否有 SQL 语法可以做到。

5155 次点击
所在节点    MySQL
23 条回复
mostkia
2018-06-20 16:46:14 +08:00
可能也是自己的说法有问题吧,明明只是想求一个 sql 语法,但却去强调了一下性能,其实性能倒是其次,我只是觉一个一个的 select 得这个方法实在是太笨了而已,需要多次请求数据库,从而连带的做了性能方面的猜想(其实就是我不了解数 mysql 据库造成的)但到最后这帖子变成了完全的性能方面的讨论,也实在是超出了我的预期。。而回复 sql 语法的也只有 16 楼。哈哈,尴尬了。。当然各位大佬说的都是经验只谈,比我瞎猜的肯定要靠谱,我个人感觉也的确有所收获,至少以后不会再去纠结性能问题。
msg7086
2018-06-20 23:50:23 +08:00
@mostkia 加索引随时都可以加,一般看慢查询日志就行了。
前期加索引也不见得就是好,因为索引除了读取收益以外,还有写入开销。
有时候你甚至会发现加了索引后比原来还慢的。
还是要具体分析具体解决。

至于 10 万炸,这种是因为「不懂」,而不是因为「没有加索引」。
这种「不懂」的人,就算一开始就加上索引,性能也会一样一团糟。
因为你的语句可能压根就用不上你点开的索引。

至于第二个帖子,你看,那么长的 SQL,恰恰是 13 楼说的把数据库当成运算器来跑的典型案例。
这种如果全部转换成单个查询(就是你说的访问数据库多次的方法)反而性能会好得多。

这帖子的本质问题还是在优化,提出的问题是很值得深思和讨论的,我觉得比单单一个 SQL 语句要有价值得多。
mostkia
2018-06-21 00:16:35 +08:00
@msg7086 也是,对于我这个程度的,能用就好,不用太纠结这些事情,毕竟接触数据库的机会也不多,慢日志和类二进制日志也完全没去了解过,哈哈。不过现在程序也写完了,跑起来也不错,也不管这破事了,有时候写代码往往会去纠结一些奇怪的地方,现在想想,不就是多几次查询嘛,怕网络性能问题集中在一起让后台查询即可。这帖子也让我对数据库在用法上有了更多了解。至少对使用上的误区有了大致的概念。
其实我更想在项目中使用的是 MongoDB 这类非关系数据库,写法比较接近前端常用的 json,对前台更友好一些,但无奈项目使用什么程序不是我说了定的,哈哈有些遗憾。再次谢谢所有回答的朋友了,不管是批评的还是指点的。结贴吧,结贴吧。认真脸  ̄▽ ̄

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

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

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

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

© 2021 V2EX