检索刚刚插入SQL表中的特定行

检索刚刚插入SQL表中的特定行,sql,perl,dbi,Sql,Perl,Dbi,我有一个名为BUILD\u INFO的表,它有以下列: BUILD\u ID BUILD\u NAME 日期 用户 BUILD\u ID是一个自动递增字段,所以我在插入时不设置它。它是用于将此表中的此行与其他表中的其他行关联的主键 当我在BUILD\u INFO表中插入新行时,我想知道设置的BUILD\u ID,以便在其他表中添加行时检索并使用它 我不能通过其他列来查询它,因为其他行可能会复制这些列值。我不能简单地重新查询表并调出最大的BUILD\u ID,因为另一个用户可能在我之后插入了一

我有一个名为
BUILD\u INFO
的表,它有以下列:

  • BUILD\u ID
  • BUILD\u NAME
  • 日期
  • 用户
BUILD\u ID
是一个自动递增字段,所以我在插入时不设置它。它是用于将此表中的此行与其他表中的其他行关联的主键

当我在
BUILD\u INFO
表中插入新行时,我想知道设置的
BUILD\u ID
,以便在其他表中添加行时检索并使用它

我不能通过其他列来查询它,因为其他行可能会复制这些列值。我不能简单地重新查询表并调出最大的
BUILD\u ID
,因为另一个用户可能在我之后插入了一行。如果有像
行号这样的东西,我可以通过它来检索和查询行,那就太好了。这样的事情存在吗

我正在使用
DBI
模块用Perl编写脚本,我的数据库可以是Oracle或MySql

如何使用Perl
DBI
模块检索刚才插入SQL或中的行的信息

$dbh->last_insert_id();
但是请参见

中的注意事项,听起来您希望在数据库句柄上使用该方法。但是,实际上,如果您查看并停止编写原始SQL,您的生活会轻松得多。

感谢您指出
DBI
包中的
DBI->last\u inserted\u row()
方法。我不熟悉
DBI
包,但不知何故错过了它,尽管它在HTML索引中的
selectrow\u hashref
方法上面只清楚列出了两个条目。这听起来像是我要找的

至于您所关心的问题,我实际上正在创建一个包,这样我们就可以不用编写原始SQL查询了。出于各种原因,我讨厌原始SQL查询。首先,它们对于大多数开发人员来说并不容易编写,而且很难理解。此外,它们通常是硬编码的数据库布局和如何连接的假设。最重要的是,大多数开发人员都不擅长编写它们

我希望我以前知道DBIx。那会帮我省下很多工作。问题是,我们的开发机器没有互联网接入,这使得安装软件包成为一大难题。我必须阅读DBIx文档。现在,它看起来比我们需要的要复杂一些


也感谢您指出了
DBI->last\u insert\u row()
方法(以及随之而来的注意事项)。不知何故,我在阅读
DBI
文档时错过了这个方法。我必须看看它是否能在Oracle中工作,它是否能在MySql中工作,因为我们索引表的列是一个自动增量列。

我正在阅读文档,但不清楚它在何处(或是否)指定了以下信息。我是否理解最后一个插入id是特定于我的dbHandle的?因此,如果我使用它插入一行并休眠30秒,在此期间,其他dbHandle插入了N个行,那么当我的dbHandle唤醒并去获取它的最后一个插入id时,它将拥有它在休眠之前插入的那一个?这当然是一个足够简单的测试。只需编写一个具有多个dbh的测试程序,看看当您使用不同的数据库句柄插入行时,最后一个插入id会发生什么情况。在我看来,最后一个\u insert\u id似乎是在插入过程中设置和存储的,所以无论其他句柄发生了什么,它都是正确的。@Dr.Dredel:是的,至少对于MySQL;对于Oracle,请查看您正在使用的DBD.davorg的文档,不要吹毛求疵,但我认为这里提出的绝大多数问题都是“足够容易测试”的问题。整个要点是利用(并贡献)已经编写了上述测试的同龄人的集体知识库,以节省自己的大量时间,并可能(正如我在本文中所做的那样)偶然发现更优雅的问题解决方案,而这些问题在我的代码中有其他(不太优雅的)解决方案。(顺便说一句,谢谢你发布了这个答案!)。