检测由于违反唯一约束而导致的 mysql 更新/插入失败

2022-08-30 22:55:41

这有点类似于这个问题:

PHP MySQL INSERT 由于唯一约束而失败

但我有不同的转折。假设我有一个只有一列的表。该列的名称是“title”,并且它上面放置了一个唯一的约束。

首先,我插入一行,其中标题=“某物”。下次我尝试插入“某些东西”时,由于唯一的键约束(这很好),它将失败。我想做的是允许它失败,并检查mysql提供的错误代码,以确保它由于唯一的键约束而失败。(即让数据库处理唯一性,我只处理错误代码,并在结果返回时告诉用户标题已经存在)。

有没有办法做到这一点?


答案 1

现在是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 对象对错误的具体性质也有很多话要说(似乎比人们可能想要或需要的更详细)。


答案 2

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
你应该总是设法避免使用幻数。相反,您可以将已知错误代码 () 分配给常量(例如 )。这将使您的代码更易于维护,因为语句中的条件在几个月后仍然可读,因为当的含义已从内存中消失时,:)1062MYSQL_CODE_DUPLICATE_KEYif1062


推荐