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

有帮助吗?

解决方案

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

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

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

如果使用DBI

,也可以在 $ sth-> {ix_sqlerrd} [1] 中找到它

其他语言/接口有变种,但我相信你会明白这一点。

其他提示

我见过这个。

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

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

  1. 您的插入
  2. 其他用户的插入
  3. 将其他用户的身份归还给您

OP没有指定使用哪个版本的Informix,因此可以有不同的答案

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top