检测由于违反唯一约束而导致的 mysql 更新/插入失败
这有点类似于这个问题:
但我有不同的转折。假设我有一个只有一列的表。该列的名称是“title”,并且它上面放置了一个唯一的约束。
首先,我插入一行,其中标题=“某物”。下次我尝试插入“某些东西”时,由于唯一的键约束(这很好),它将失败。我想做的是允许它失败,并检查mysql提供的错误代码,以确保它由于唯一的键约束而失败。(即让数据库处理唯一性,我只处理错误代码,并在结果返回时告诉用户标题已经存在)。
有没有办法做到这一点?
这有点类似于这个问题:
但我有不同的转折。假设我有一个只有一列的表。该列的名称是“title”,并且它上面放置了一个唯一的约束。
首先,我插入一行,其中标题=“某物”。下次我尝试插入“某些东西”时,由于唯一的键约束(这很好),它将失败。我想做的是允许它失败,并检查mysql提供的错误代码,以确保它由于唯一的键约束而失败。(即让数据库处理唯一性,我只处理错误代码,并在结果返回时告诉用户标题已经存在)。
有没有办法做到这一点?
现在是2015年,很少有理由不使用PHP的PDO实现。
用于检测和处理由于键约束冲突而导致的插入失败的正确现代“OO”方法如下:
try {
//PDO query execution goes here.
}
catch (\PDOException $e) {
if ($e->errorInfo[1] == 1062) {
//The INSERT query failed due to a key constraint violation.
}
}
PDOException 对象对错误的具体性质也有很多话要说(似乎比人们可能想要或需要的更详细)。
http://dev.mysql.com/doc/refman/5.5/en/error-messages-server.html
http://php.net/manual/en/function.mysql-errno.php
我过去不得不这样做,这并不好玩:
if( mysql_errno() == 1062) {
// Duplicate key
} else {
// ZOMGFAILURE
}
关于编程风格的说明(从这个答案中致谢 jensgram)
你应该总是设法避免使用幻数。相反,您可以将已知错误代码 () 分配给常量(例如 )。这将使您的代码更易于维护,因为语句中的条件在几个月后仍然可读,因为当的含义已从内存中消失时,:)1062
MYSQL_CODE_DUPLICATE_KEY
if
1062