MySQL插入:先测试?

时间:2009-01-13 18:16:11

标签: php mysql database

例如,在将记录插入具有唯一索引的表中时,最好先测试吗? 例如

$mysqli->query('SELECT email FROM tblUser WHERE email = 'foo@bar.org');

然后确保返回0行,然后进行插入?

$mysqli->query('INSERT INTO tblUser ...');

或者,如果有重复的条目,是否最好跳过测试并处理错误?

谢谢!

6 个答案:

答案 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)

你肯定想先测试,你可能想测试一些事情,这样你就可以告诉用户出了什么问题。

例如,我刚刚完成了一项工作,用户需要一个唯一的用户名和一个唯一的电子邮件地址。