Informix:如何获取最后插入记录的 id

Posted

技术标签:

【中文标题】Informix:如何获取最后插入记录的 id【英文标题】:Informix: how to get an id of the last inserted record 【发布时间】:2008-10-29 14:22:09 【问题描述】:

在 INSERT 语句之后获取 SERIAL 列的值的最有效方法是什么? IE。我正在寻找一种方法来复制 MS SQL 的 @@IDENTITYSCOPE_IDENTITY 功能

【问题讨论】:

【参考方案1】:

最后一个 SERIAL 插入的值存储在 SQLCA 记录中,作为 sqlerrd 数组中的第二个条目。 Brian 的回答对于 ESQL/C 是正确的,但是您没有提到您使用的是什么语言。

如果您正在编写存储过程,则可以这样找到值:

LET new_id = DBINFO('sqlca.sqlerrd1');

如果使用 DBI,也可以在 $sth->ix_sqlerrd[1] 中找到

还有其他语言/界面的变体,但我相信你会明白的。

【讨论】:

【参考方案2】:

我见过这种用法。

if LOCAL_SQLCA^.sqlcode = 0 then
/* return serial */
  Result := LOCAL_SQLCA^.sqlerrd[1]
else
/* return error code */
  Result := -(Abs(LOCAL_SQLCA^.sqlcode));

【讨论】:

那是什么语言?是帕斯卡吗?被否定的 ABS 有点奇怪;除非您正在建立连接(遗憾的是,至少存在一个正错误),否则 Informix 中的所有错误编号都是负数。【参考方案3】:

我不认为“高效”是您在这里寻找的词。这更多的是准确性问题。我不确定我能不能比 SQL 联机丛书更好地解释它,但一般来说,除非你真的知道你在做什么并且有使用 @@IDENTITY 的特定原因,否则请使用 SCOPE_IDENTITY。最明显的原因是@@IDENTITY 不会返回您的程序/sp/etc 添加的最新记录的标识,如果有一个触发器附加到表。此外,在大容量应用程序中可能会出现两个事务同时发生的问题,并且会发生以下情况......

    您的插入 其他用户的插入 将其他用户的身份返回给您

【讨论】:

您可能会注意到问题是关于 Informix,而不是 MS SQL【参考方案4】:

OP 没有说明使用的是哪个版本的 Informix,所以可能会有不同的答案

【讨论】:

这是不可靠的 - 自从您插入后,其他人可能插入了一个更新、更大的值。 OP 没有说明使用的是哪个 Informix 版本,所以可能有多个正确答案。

以上是关于Informix:如何获取最后插入记录的 id的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有'id'列的MySql中获取最后插入的记录?

如何在多条记录插入中获取最后插入的 id?

如果同时插入两条记录,如何获取最后一个ID

如何在使用 PHP-PDO 记录查询时获取最后一个插入 ID

如何避免informix中的锁异常

如何从 JayData 事务中获取最后插入 ID?