对于INSERT IGNORE
是否有通用的方法可以在所有数据库驱动程序上使用PDO?
如果没有,假设以下方法可行是否公平:
try {
$stmt = $db->prepare("INSERT INTO link_table (id1, id2) VALUES (:id1, :id2)");
$stmt->execute(array( ':id1' => $id1, ':id2' => $id2 ));
}
catch (PDOException $ex) {
// Thanks to comment by Mike:
// Re-throw exception if it wasn't a constraint violation.
if ($ex->getCode() != 23000)
throw $ex;
}
答案 0 :(得分:2)
AFAIK没有没有适用于所有数据库驱动程序的通用版本。 INSERT IGNORE
和INSERT...ON DUPLICATE KEY UPDATE
特定于MySQL。
首先选择现有记录,或删除现有记录并重新插入都会出现问题,包括竞争条件和可能的外键约束违规或级联删除。
我认为你的方法可能是最安全的。如果要确定异常原因,可以随时check the error code - 请参阅:
http://docstore.mik.ua/orelly/java-ent/jenut/ch08_06.htm
我想你可能想检查代码23000。
答案 1 :(得分:1)
您的代码可能会有效,但执行PDO语句时还有其他一些问题可能会出错。您将需要检查是否确实收到了约束违规,即使它不是另一种类型(例如,当插入一对没有相应行的值时,您也可能会收到外键冲突。引用表)。 AFAIK,虽然没有跨DBMS的方法来实现这一点。
对于支持事务的DBMS(Oracle,SQL Server,PostgreSQL,MySQL在某种程度上......),这里有一个不同的方法: