在ColdFusion中检索SQL插入后的自动生成id值



我在这里多次看到类似的问题,但没有一个与ColdFusion有关。根据一些答案,这是我试图运行的代码:

<cfquery name="getTest" datasource="POW" result="result">
INSERT INTO myStuff (Stuff)
VALUES ('My test 3')
</cfquery>
<cfdump var="#result#" >

这就是我得到的:

struct
CACHED  false
EXECUTIONTIME   47
RECORDCOUNT 1
SQL INSERT INTO myStuff (Stuff) VALUES ('My test 3')

如果我切换到result=result。GeneratedKey,我得到了一个新的,标题为Generated Key,但里面没有值。

我很感激任何人能提供的帮助。

不幸的是,您遇到了使用不受支持的桌面数据库(如MS Access(的缺点之一。它将缺少一些更高级的功能。部分原因是由于MS Access本身的限制,但也由于Adobe放弃了对它的支持。更好的方法是升级到一个更健壮、专为web应用程序并发而设计的数据库,如SQL Server。如果这不是一个选择,你会陷入不太理想的解决方案。。。

不要使用SELECT MAX(ID)

正如您已经猜到的,有一件事是而不是选项,那就是使用select max(ID)。它不是线程安全的,所以不能保证您能取回刚刚插入的记录的ID。底线是,不要使用它。

可能的选项

在CF8引入result属性之前,一种典型的方法是在插入后使用dbms特定的函数来返回新生成的ID。例如,使用SQLServer:

<cfquery name="qInsert" ....>
INSERT INTO SomeTable (....)
VALUES (...)
SELECT SCOPE_IDENTITY() AS GeneratedIDValue
</cfquery>

IIRC Access也有类似的功能:@@IDENTITY。AFAIK,它是特定于当前数据库连接的,因此应该是线程安全的。遗憾的是,Access不支持在同一个cfquery中执行多个语句。至少不是我上次检查的时候。因此,您可能需要使用两个cfquery。必须将两个查询封装在事务中,以确保它们都使用相同的数据库连接/会话:

<cftransaction>
<cfquery ....>
INSERT INTO SomeTable (....)
VALUES (...)
SELECT SCOPE_IDENTITY() AS GeneratedIDValue
</cfquery>
<cfquery name="qInsert" ....>
SELECT @@IDENTITY AS GeneratedIDValue
</cfquery>
</cftransaction>

<cfoutput>
Generated ID: #qInsert.GeneratedIDValue#
</cfoutput>

最新更新