【问题标题】:Ignore duplicate key upon insert with PDO使用 PDO 插入时忽略重复键
【发布时间】:2011-09-24 06:51:29
【问题描述】:

有没有一种通用的方法来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;
}

【问题讨论】:

  • @Haim Evgi 从我读到的INSERT IGNORE INTO 是一个非标准的 SQL 功能,只适用于 MySQL。

标签: mysql sql-server database postgresql pdo


【解决方案1】:

AFAIK 不,没有适用于所有数据库驱动程序的通用版本。 INSERT IGNOREINSERT...ON DUPLICATE KEY UPDATE 特定于 MySQL。

通过首先选择现有记录来检查现有记录,或者删除现有记录并重新插入都容易出现问题,包括竞争条件和可能违反外键约束或级联删除。

我认为您的方法可能是最安全的。如果您想确定异常的原因,您可以随时check the error code - 请参阅:

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

我想你可能想检查一下代码 23000。

【讨论】:

    【解决方案2】:

    您的代码可能会工作,但在执行 PDO 语句时可能会出现其他问题。您将需要检查您是否真的收到了约束违规,即使它不是另一种类型(例如,当您在其中一个中插入一对没有对应行的值时,您也可能收到外键违规参考表)。 AFAIK,虽然没有跨 DBMS 的方式来实现这一点。

    对于支持事务的 DBMS(Oracle、SQL Server、PostgreSQL、MySQL 在某种程度上...),这里有一种不同的方法:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-22
      • 2017-10-16
      • 1970-01-01
      • 1970-01-01
      • 2017-04-20
      • 2017-06-19
      • 1970-01-01
      • 2016-03-03
      相关资源
      最近更新 更多