使用PDO插入时忽略重复的键

3

有没有一种通用的方法可以使用PDO进行INSERT IGNORE并适用于所有数据库驱动程序?

如果没有,以下做法是否可行:

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

根据我所了解的,INSERT IGNORE INTO 是一种非标准的 SQL 功能,仅适用于 MySQL。 - Lea Hayes
2个回答

2
据我所知,没有通用版本适用于所有数据库驱动程序。 INSERT IGNOREINSERT...ON DUPLICATE KEY UPDATE 是专门针对 MySQL 的。
通过先选择现有记录来检查现有记录,或删除现有记录并重新插入,都容易出现问题,包括竞争条件和可能的外键约束违规或级联删除。
我认为你的方法可能是最安全的。如果您想确定异常的原因,您始终可以检查错误代码-请参见:

http://docstore.mik.ua/orelly/java-ent/jenut/ch08_06.htm

我认为您可能需要检查代码23000。

1

你的代码可能会起作用,但在执行PDO语句时还有其他可能出错的地方。你需要检查是否真的收到了约束违规的信息,即使它不是不同类型的(例如,在插入一对没有对应行的值时,您也可能收到外键违规)。据我所知,目前没有跨数据库管理系统实现这一点的方法。

对于支持事务的DBMS(Oracle、SQL Server、PostgreSQL、MySQL等),这里有一个不同的方法:

  1. 开始事务
  2. 删除所有与要插入的行匹配的行(删除零个或一个行)
  3. 插入
  4. 提交

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接