我知道这个错误意味着什么,以及它为什么会发生,这意味着这不是覆盖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
。
我完全明白为什么我会收到这个错误 - 我只是不明白为什么它会导致我的提交被删除?我认为它应该继续工作而忽略了一些记录没有被插入的事实,因为它们是重复的?
建议赞赏!
答案 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