例如,在将记录插入具有唯一索引的表中时,最好先测试吗? 例如,
$mysqli->query('SELECT email FROM tblUser WHERE email = 'foo@bar.org');
然后确保返回0行,然后进行插入?
$mysqli->query('INSERT INTO tblUser ...');
或者,如果有重复的条目,是否最好跳过测试并处理错误?
谢谢!
答案 0 :(得分:11)
最好插入并处理任何重复的键错误。
原因是如果您先测试,其他一些客户端仍然可以在测试和插入之间的短暂时刻插入值。所以你无论如何都需要处理错误。
答案 1 :(得分:7)
从广义上讲,有三种方法可以通过单个查询处理这种情况(较少的查询通常是拍摄的好东西),但它们都不是通用的“最佳方式”。您应该使用哪种方法取决于您的需求。
首先,正如您所提到的,盲目地运行INSERT …
并处理PHP的任何错误。当重复键指示程序问题(软件中的错误,用户尝试注册已使用的名称等等)时,这是最好的方法,因为它允许您在提交数据库更新之前执行其他操作
其次,有INSERT IGNORE …
语法。我倾向于将此称为最不常用的方法,因为如果密钥已经存在,完全丢弃您的INSERT
。当一行(或多行)可能已经或可能没有先前添加到表中,但已知数据未发生更改时,这非常有用。
最后,您可以使用INSERT … ON DUPLICATE KEY UPDATE …
语句。这些可能会变得相当冗长,但非常方便,因为它们允许您将数据插入表中,而不必担心是否存在旧数据。如果是,则更新现有行。如果没有,则插入新的。无论哪种方式,您的表格都将提供最新数据。
答案 2 :(得分:1)
如果要忽略创建一个具有已存在另一行的键值的行的插入,则MySQL支持插入忽略。
确保tblUser中的电子邮件中有唯一索引并执行
$mysqli->query('INSERT IGNORE INTO tblUser ...');
答案 3 :(得分:0)
这取决于您是否要确保插入的值不存在。如果文件上有唯一键,那么重要的是不要创建重复键(这会引发错误)。很多时候你也想测试是否存在记录,如果是这样的话,返回记录的主键,这样你就可以更新记录,如果没有,那么就插入记录。
但是,如果您没有唯一的密钥,并且不关心信息是否跨字段或字段组合重复,那么这不是必需的,可以节省一点时间。这取决于具体情况。
HTH
答案 4 :(得分:0)
通常取决于适用数据复制的规则。
在您的示例中,您的应用是否允许多个用户拥有相同的电子邮件地址?如果没有,那么你需要进行检查。
答案 5 :(得分:0)
你肯定想先测试,你可能想测试一些事情,这样你就可以告诉用户出了什么问题。
例如,我刚刚完成了一项工作,用户需要一个唯一的用户名和一个唯一的电子邮件地址。