【发布时间】:2011-05-07 07:58:57
【问题描述】:
我熟悉 MySQL 函数 LAST_INSERT_ID;是否有类似的功能可以通过 ODBC 对 MS Access 数据库执行相同的查询?
在我的具体情况下,我使用 PHP+PDO 将行插入到 Access 数据库中,并且想知道每次插入时的最后一个主键值。
如果此功能不可用,是否有其他选择? (不改变数据库)
谢谢。
【问题讨论】:
标签: php sql ms-access insert pdo
我熟悉 MySQL 函数 LAST_INSERT_ID;是否有类似的功能可以通过 ODBC 对 MS Access 数据库执行相同的查询?
在我的具体情况下,我使用 PHP+PDO 将行插入到 Access 数据库中,并且想知道每次插入时的最后一个主键值。
如果此功能不可用,是否有其他选择? (不改变数据库)
谢谢。
【问题讨论】:
标签: php sql ms-access insert pdo
Access 2000 或更高版本似乎支持@@IDENTITY 属性。因此,您只需要在 INSERT 之后选择它的值:
select @@IDENTITY from myTable
请查看 MSDN 链接:Retrieving Identity or Autonumber Values
简而言之:
[...] Microsoft Access 2000 或更高版本不支持@@IDENTITY 属性在INSERT 之后检索自动编号字段的值。使用 RowUpdated 事件,您可以确定是否发生了 INSERT,检索最新的 @@IDENTITY 值,并将其放在 DataSet 中本地表的标识列中。
【讨论】:
SELECT @@IDENTITY。
正如其他人所说,SELECT @@IDENTITY 与 Jet 4 和 ACE 配合使用。
Access 2010 引入了一个新的考虑因素,这是因为新的 ACE 版本支持相当于触发器的表级数据宏。因此,一个表中的插入可能会触发另一个表中的插入,因此 @@IDENTITY 可能是第二个表的值,而不是顶级表的值。据我所知,在这种情况下,没有与 SQL Server 的 SCOPE_IDENTITY() 等效的方法。
我在其他 Access 论坛上询问过它,但似乎没有人知道。如果您将 ACCDB 与表级数据宏一起使用,则需要注意这一点。
【讨论】:
我从未尝试使用 php 访问,但我想到了两个想法,第一个很简单。这就是在插入后从表中简单地选择 max(id),因为它是自动递增的,您将获得应该是插入值的最高值。其次,您可以尝试使用 odbc_cursor (http://au2.php.net/manual/en/function.odbc-cursor.php)。
【讨论】:
尝试在插入后运行“SELECT @@IDENTITY FROM MyTable”。
【讨论】: