MySQL如何避免PHP中的重复条目
我认为最有效的方法是在表上创建一个MySQL如何避免PHP中的重复条目,php,mysql,sql,duplicates,unique,Php,Mysql,Sql,Duplicates,Unique,我认为最有效的方法是在表上创建一个UNIQUE字段,而不是在执行任何其他操作之前选择检查现有值,但这需要使用两个查询。相反,对于唯一的字段,只需要一个查询,因为MySQL会为您进行检查。问题是重复条目错误会导致内部服务器错误,我无法在PHP中恢复该错误。你们有什么建议,在PHP和MySQL应用程序中避免重复条目的最佳方法是什么?您可以使用REPLACE-INTO进行查询,它将首先尝试插入,然后删除具有相同ID的行并替换它 在重复键上使用 将值($to\u uid,$send\u amount)插
UNIQUE
字段,而不是在执行任何其他操作之前选择检查现有值,但这需要使用两个查询。相反,对于唯一的字段,只需要一个查询,因为MySQL会为您进行检查。问题是重复条目错误会导致内部服务器错误,我无法在PHP中恢复该错误。你们有什么建议,在PHP和MySQL应用程序中避免重复条目的最佳方法是什么?您可以使用REPLACE-INTO进行查询,它将首先尝试插入,然后删除具有相同ID的行并替换它
在重复键上使用
将值($to\u uid,$send\u amount)插入someTable(id,amount)
重复密钥更新金额=金额+发送金额
2) 您可以捕获重复密钥异常。PDO示例:
try{
$stmt->execute(...);
}
catch(PDOException $e){
if($e->errorInfo[1] == 1062){
// Mysql returned 1062 error code which means a duplicate key
}
}
找到了解决方案强>
CodeIgniter需要设置
$db['default']['stricton'] = TRUE;
明确的呼唤
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
为了让MySQL抛出异常。还必须捕获异常。您可以使用INSERT IGNORE
防止更新行,并防止在行已存在时引发异常
如果使用IGNORE关键字,则会显示在执行
INSERT语句被忽略。例如,在不忽略的情况下,一行
复制表中现有的唯一索引或主键值
导致重复键错误,语句被中止。具有
忽略,仍不会插入该行,但不会发生错误。忽略
错误可能会生成警告,但重复的键错误会生成警告
不是
最好在运行插入之前检查并确认是否存在重复性query@nedstark使用唯一的
约束不是更好吗?更快?“问题是重复的输入错误会导致内部服务器错误,我无法在PHP中恢复”这听起来很奇怪explain@Dagon听起来确实如此,顺便说一句,我正在使用CodeIgniter。每次我尝试在具有唯一性约束的字段中插入相同的信息时,为了进行测试,我会得到一个内部服务器错误500
。我已经尝试了try/catch
块,但程序只是停止执行…在某个地方会有一些错误消息,找到它。这不是我想要的。我不想替换任何东西,我只是想避免输入已经存在的信息。你说重复的错误无法恢复,我想Dagon有不同的想法。谢谢你,但是我正在使用的mysqli或CodeIgniter呢?普通的try/catch不起作用。因为默认情况下,mysqli
不会引发异常Mysqli
函数只返回false。如果你想让mysqli在出错时抛出异常,或者在示例mysqli::query
返回错误时,只需检查1062代码的mysqli::$errno
,我猜我将在CodeIgniter中询问如何执行此操作代码>在我的回答评论中。酷家伙回答了。Great@Didar_Uranov我感谢您的帮助,但这实际上是一个您未能解决的CodeIgniter问题。如果没有我提到的设置,MySQL将无法抛出异常。