在 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 后获取最后插入的行?的主要内容,如果未能解决你的问题,请参考以下文章