【问题标题】:How can I fetch the last row I inserted using DBI?如何获取使用 DBI 插入的最后一行?
【发布时间】:2016-06-13 17:27:24
【问题描述】:

如何获取使用DBI (DBD::mysql) 插入的最后一行?

代码示例:

my $sth = $dbh->prepare('INSERT INTO a ( x, y, z ) VALUES ( ?, ?, ? )');
$sth->execute( $x, $y, $z );

如何访问由上述prepare 语句插入的数据?我需要获取主 ID (AUTOINCREMENT) 值。

更新:

来自DBD::mysql 文档:

另一种访问方式 属性是通过 $dbh->{'mysql_insertid'}.

感谢Mannin0rd 的回答。 :-)

【问题讨论】:

    标签: perl dbi


    【解决方案1】:

    这是语句句柄的一个属性。您应该能够像这样访问 ID:

    $sth->{mysql_insertid}
    

    【讨论】:

    • $dbh->{mysql_insertid} 返回相同。
    • 如果您的插入和此调用之间有插入,您不能得到不同的答案吗?
    • 当然。您应该在您感兴趣的 INSERT 语句之后立即查询 $sth->{ mysql_insertid }
    • 改写下面所说的内容。 . .我相信山姆要问的是插入和检索之间的窗口是否可能有来自外部进程的插入插入。是的,它可以,但是 mysql_insertid(不要在 oracle 上尝试)是 您的会话 执行的最后一个插入,所以不用担心。
    【解决方案2】:

    与数据库无关的方法是使用DBIlast_insert_id 方法。这种方法有助于减少对特定数据库的依赖:

    $dbh->last_insert_id

    $rv = $dbh->last_insert_id($catalog, $schema, $table, $field);

    如果可能,返回一个值“标识”刚刚插入的行。通常,这将是数据库服务器分配给具有 auto_increment 或串行类型的列的值。如果驱动程序不支持该方法或无法确定该值,则返回 undef。

    【讨论】:

    • 一些 DBD 驱动程序只使用 $dbh->last_insert_id()(例如 DBD::MariaDB)。
    【解决方案3】:

    SELECT LAST_INSERT_ID() query 也会返回你想要的。

    【讨论】:

    • @Anthony 不正确。 LAST_INSERT_ID() 仅与您当前的 mysql 连接相关,不受其他人在您的服务器上执行的操作的影响。
    • 底层DBI驱动可能不是mysql
    猜你喜欢
    • 2019-11-21
    • 1970-01-01
    • 2023-02-17
    • 2013-08-28
    • 1970-01-01
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多