为防止重复的用户名被输入数据库并通知用户,插入或选择查询之前使用异常捕获更标准/首选吗?
异常捕获:如果我尝试插入用户输入并且用户名已存在,那么SQL数据库将抛出主键约束违例异常。如果发生这种情况我会抓住它并做任何事情。
选择查询:如果它返回任何与用户名匹配的元组,那么我就不会打扰插入了。然后我可以显示错误消息。
我想在这里使用Exceptions的主要优点是查询和行数较少(速度更快?)。但是,我不认为这是一个例外情况,因为重复可能经常发生。
答案 0 :(得分:4)
至少,您应该使用选项1 - 处理主键约束违规 - 如果可能,因为数据库是最后一个入口点。如果检查代码中的重复项(尽管非常不可能),仍然可以进行复制,因为在返回初始SELECT和发回INSERT语句之间存在延迟,而另一个用户可能在该时间窗口中执行了相同的插入。
但是,首先运行select以查看记录是否存在可能更有效,而不是盲目地让插入每次都运行。
所以我会推荐两者。
答案 1 :(得分:2)
如果您使用Exception catching
方法,即尝试插入,请记住Exception
counter
auto_increment column
{{1}} {{1}}会增加的一件事让我们举个例子已成功插入一条记录且其 ID为1 然后您尝试插入与Exception相同的信息,然后尝试插入具有不同数据的其他数据将插入但是ID为no 。这个时间将是3而不是2,因为当异常发生时1增加所以请记住,如果你玩Exception案例,当异常发生时你会丢失这些id no.s。如果id计数器不是你的关注那么继续这个选项。
但我更喜欢先选择然后插入
希望它有意义
答案 2 :(得分:0)
除非,您的数据库查询层提供了多个Exception类(对于每个SQL状态 - 如果是关系数据库),您不应该使用Exception捕获;在这种情况下,您需要依赖例外的消息 - 它可能会随着时间而改变。
答案 3 :(得分:0)
我认为实际上并没有这样做的“标准”。要么查询,要么插入,要么转到INSERT / exception。
如果正确应用,两者都可以正常工作。
我通常更喜欢让数据库执行此任务。更改表格,使您想要唯一的字段实际上是唯一索引。如果要插入数据并且它是重复的,您将收到一个错误,可用于确定下一步该做什么。或者,如果您想要执行另一个表操作(如果需要),可以使用ON DUPLICATE KEY
(如果在您选择的RDBMS上可用)。
这样可以避免在数据库端出现问题(如果不仅是应用程序写入这些表)。即使您先查询,也应该执行此操作以获得可靠的表格。