SQLSTATE [23000]:完整性约束违规错误处理

时间:2014-05-31 19:44:53

标签: mysql sql pdo duplicates

我知道这个错误意味着什么,以及它为什么会发生,这意味着这不是覆盖State 23000的许多主题的重复。我使用PDO将重复记录插入到一​​个表中化合物PK。我是故意这样做的,以便自动取消在此特定表中插入任何重复的记录。

错误SQLSTATE[23000]: Integrity constraint violation正在查杀脚本。有没有办法为这个特定的错误设置警告级别,从字面上告诉它关闭并继续?

如果我们不能让他们为我们工作,我不明白复合PK的目的吗?

我对数据库管理不是很有经验,所以如果我遇到一些问题,你就不得不原谅我,如果我用锤子敲打它就应该有用。

表格结构:

CREATE TABLE `cart` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `userid` int(10) NOT NULL,
 `itemid` int(10) NOT NULL,
 UNIQUE KEY `id` (`id`),
 UNIQUE KEY `unique_records` (`userid`,`itemid`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=latin1

请注意复合PK称为'唯一记录'。

所以我有这张桌子:

| id | userid | itemid |
|  1 |    175 |     12 |

我执行此查询:

    $insertItem = $db->query("
                              INSERT INTO cart (userid, itemid) 
                              VALUES (:userid, :itemid), 
                              array("userid"=>"175", "itemid"=>"12")
                            ");

执行此查询会提示此错误:SQLSTATE[23000]: Integrity constraint violation

我完全明白为什么我会收到这个错误 - 我只是不明白为什么它会导致我的提交被删除?我认为它应该继续工作而忽略了一些记录没有被插入的事实,因为它们是重复的?

建议赞赏!

2 个答案:

答案 0 :(得分:1)

如果您希望insert继续有效,可以尝试使用INSERT IGNORE

INSERT IGNORE INTO cart(userid, itemid) 
    VALUES (:userid, :itemid);

INSERT IGNORE可能有点强,因为它会忽略所有错误。如果您只想忽略重复键错误,请使用on duplicate key并为自己设置一个值:

INSERT IGNORE INTO cart(userid, itemid) 
    VALUES (:userid, :itemid)
    ON DUPLICATE KEY userid = values(userid);

set部分什么都不做 - 值不会改变 - 但效果是忽略错误。

答案 1 :(得分:1)

您的问题似乎很模糊 - 您要么忽略违反完整性约束的行为,要么希望它们成为“不再插入”的信号。

除了insert ignore解决方案的答案之外 - 当您执行查询并获得SQLSTATE[23000]: Integrity constraint violation错误时,这意味着PDO会抛出异常。如果你没有catch它,你的脚本就会被杀死。如果您不希望它被杀死,请将您的DB代码包装到try-catch构造中,即:

try {
    // code here
    $insertItem = $db->query("
                              INSERT INTO cart (userid, itemid) 
                              VALUES (:userid, :itemid)", 
                              array("userid"=>"175", "itemid"=>"12")
                            );
    // more code here
} catch(Exception $e) {
    // handle exception - 
    // find out if it is caused by integrity contraints violations
    // and if it is - merely go further
    // otherwise do something else, like re-throwing your exception
}

HTH