在 PDO(使用 MySQL)中执行 INSERT 后获取最后插入的行?

Posted

技术标签:

【中文标题】在 PDO(使用 MySQL)中执行 INSERT 后获取最后插入的行?【英文标题】:Getting the last inserted row after doing an INSERT in PDO (with MySQL)? 【发布时间】:2014-01-31 14:19:01 【问题描述】:

当将一个新对象(作为一行)插入 mysql 数据库时,我想取回最后插入的行(id 并不总是足够的,因为我想在一些 INSERT 没有任何 INSERT 的通用函数中使用它自动递增的 ID)。

我需要这个来成功返回完整的对象,使用可能是数据库创建的 id、时间戳,或者在某些情况下只是我在插入之前知道的值 - 所以 PDO::lastInsertId 不能解决问题。

$query = "INSERT INTO table (".$colinsert.") VALUES (".$colbind.")";
$stmt = $this->db->prepare($query);
$ex = $stmt->execute();
// ... if $ex was successful, how do I retrieve the last inserted row now?

独立于数据库的解决方案会很好,但如果它是特定于 MySQL 的,也可以 :-)

编辑:为了防止一些误解 - 例如我有带有以下行的表 user_contact_connection(contact_id、user_id、additional_connection_info)。主键是 (contact_id,user_id)。在这种情况下,PDO::lastInsertId 返回 0,因为没有自动递增列。

好的。在这种情况下,我知道我一直在插入哪一行,但是我仍然希望找到一种方法来获取最后插入的行而不显式查询 ID?这甚至可能吗?

【问题讨论】:

您已经拥有$colbind,那么有什么问题吗?使用 ->lastInsertId 获取最后一个插入 id 并在其上查询数据库,为您提供该行的完整信息。 你有主键吗? 有时我有一个带有一个列的主键,有时是一个带有多个列的主键 - 正如已经说过的,我需要它用于通用函数并且我希望返回 ROW。 使用 mysql 你只能有 1 个auto_increment id。这就是您通过lastInsertId 得到的回报。如果您有复合索引,那么无论如何您都必须手动提供其他部分。只有未知部分是您有解决方案的 auto_incremaented 值。 嗯,好的,谢谢,我不想排除多个 auto_incremented 序列的可能性。这简化了问题,也可能是一个很好的答案(但是,如果他们也提供获取整行的功能,那将是舒适的)。 【参考方案1】:

如果您想在数据库中持久化后使用一个对象,并且您希望该对象具有您的数据库计算的值(例如,返回您未在插入语句中提供的默认值,请获取时间戳由 MySQL NOW() 等产生),可能最好的方法是在插入后获取。然而,使用像 Doctrine 这样的 ORM 库,您可以在持久化之前使用所有值构造对象,但是您必须提供默认值、时间戳等(无论如何都必须获取自动增量)。

【讨论】:

以上是关于在 PDO(使用 MySQL)中执行 INSERT 后获取最后插入的行?的主要内容,如果未能解决你的问题,请参考以下文章

PHP、PDO、MySQL - 多个 INSERT 容易被注入? [复制]

MySQL 性能不佳 INSERT 或 PHP PDO

PDO中执行SQL语句

MySQL与PDO [重复]

执行 pdo insert 排除某些参数

通过 PDO 扩展与 MySQL 数据库交互(下)