我有一个MySQL表,其中有一个电子邮件地址字段,定义为唯一.对于此示例,假设我的所有表单都允许用户将其电子邮件地址插入表中.
由于电子邮件字段是唯一的,因此如果查询尝试两次输入相同的电子邮件,则查询失败.我很好奇两种情况之间的权衡:
1)SELECT在执行插入之前运行快速语句.如果select返回结果,则通知用户,并且不运行该INSERT语句.
2)运行该INSERT语句,并检查重复的条目错误
// snippet uses PDO
if (!$prep->execute($values))
{
$err = $prep->errorInfo();
if (isset($err[1]))
{
// 1062 - Duplicate entry
if ($err[1] == 1062)
echo 'This email already exists.';
}
}
Run Code Online (Sandbox Code Playgroud)
另外,请假设正常使用,这意味着重复的条目应该是最小的.因此,在第一个场景中,您显然需要为每个插入运行额外查询的开销,而在第二个场景中,您依赖于错误处理.
另外,我很想听听有关编码风格的想法.我心里说'做一名防守程序员!在插入之前检查数据!' 虽然我的大脑说'嗯,也许最好让MySQL负责为你检查数据'.
编辑 - 请注意这不是"我该怎么做"的问题,而是"我为什么要这样做"的问题.我包含的小代码片段有效,但我很好奇的是解决问题的最佳方法.