插入PDO时忽略重复键

时间:2011-06-28 12:30:48

标签: mysql sql-server database postgresql pdo

对于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;
}

2 个答案:

答案 0 :(得分:2)

AFAIK没有没有适用于所有数据库驱动程序的通用版本。 INSERT IGNOREINSERT...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在某种程度上......),这里有一个不同的方法:

  1. 启动交易
  2. 删除与要插入的行匹配的所有行(删除零行或一行)
  3. 插入
  4. 提交