例如,在将记录插入具有唯一索引的表中时,最好先测试吗?例如,
$mysqli->query('SELECT email FROM tblUser WHERE email = 'foo@bar.org');
然后确保返回0行,然后插入?
$mysqli->query('INSERT INTO tblUser ...');
或者,如果有重复的条目,最好是跳过测试并处理错误?
谢谢!
最好插入和处理任何重复的键错误.
原因是如果您先测试,其他一些客户端仍然可以在测试和插入之间的短暂时刻插入值.所以你无论如何都需要处理错误.
从广义上讲,有三种方法可以通过单个查询处理这种情况(较少的查询通常是一个好东西可以拍摄),但它们都不是通用的"最佳方式".您应该使用哪种方法取决于您的需求.
首先,正如你所提到的,INSERT …
盲目地运行并处理PHP的任何错误.当重复键指示程序问题(软件中的错误,用户尝试注册已使用的名称等等)时,这是最好的方法,因为它允许您在提交数据库更新之前执行其他操作.
其次,有INSERT IGNORE …
语法.我倾向于称这是最不常用的方法,因为如果密钥已经存在,它会INSERT
完全丢弃你的方法.当一行(或多行)可能已经或可能没有先前添加到表中时,主要有用,但已知数据没有更改.
最后,您可以使用INSERT … ON DUPLICATE KEY UPDATE …
声明.这些可能会变得相当冗长,但非常方便,因为它们允许您将数据插入表中,而不必担心是否存在旧数据.如果是,则更新现有行.如果没有,则插入新的.无论哪种方式,您的表格都将提供最新数据.