使用 CFINSERT 后获取主键 - ColdFusion

Get Primary Key after using CFINSERT - ColdFusion

当我使用 CFINSERT 时,表单数据被插入到我的数据库中,因为字段名称与列名称匹配。

我的问题: 我怎样才能得到我刚刚使用 CFINSERT 添加的行的主键?

我知道我不能使用类似于标准 cfquery 的 "Result='variable'" 那么获取主键的最佳方法是什么?

如果我 运行 在我的 cfinsert 之后直接执行以下查询,它应该 return 之前的 PK:

<cfquery name="getID" datasource="#mydsn#" result="#result#">
select Max(id) as NewID from myTablename;
</cfquery>

这是完成我想要做的事情的最佳方式吗?

由于您在 SQL 服务器上,您可以使用 SCOPE_IDENTITY() 函数安全地获取当前范围中最后插入的标识值。

The documentation

SCOPE_IDENTITY (Transact-SQL)

Returns the last identity value inserted into an identity column in the same scope. A scope is a module: a stored procedure, trigger, function, or batch. Therefore, two statements are in the same scope if they are in the same stored procedure, function, or batch.

当在两个单独的 ColdFusion 标签中使用时(<cfinsert> 后跟 <cfquery>),那么这是两个批次,SCOPE_IDENTITY() 将不再起作用。因此 INSERTSELECT 语句必须属于同一批。不幸的是,这无法通过 <cfinsert>.

实现

您说您的表单中有很多字段 post,所以我会这样做:

<cfset fieldNames = "all,relevant,field,names,from,http,post">
<cfset fieldTypes = "INTEGER,VARCHAR,VARCHAR,DATETIME,INTEGER,VARCHAR,VARCHAR">
<cfset fieldNullable = "false,true,true,true,false,true,false">
<cfset fieldCount = ListLen(fieldNames)>

<!--- default "" for any fields missing from the HTTP POST --->
<cfloop from="1" to="#fieldCount#" index="i">
  <cfparam name="FORM.#ListGetAt(fieldNames, i)#" default="">
</cfloop>

<cfquery name="insert" datasource="#yourdatasource#">
  INSERT YourTable (#fieldNames#)
  VALUES (
    <cfloop from="1" to="#fieldCount#" index="i">
      <cfif i gt 1>,</cfif>
      <cfset val = FORM[ListGetAt(fieldNames, i)]>
      <cfset type = "CF_SQL_#ListGetAt(fieldTypes, i)#">
      <cfset null = ListGetAt(fieldNullable, i) eq "true" and val eq "">
      <cfqueryparam value="#val#" cfsqltype="#type#" null="#null#">
    </cfloop>
  )

  SELECT SCOPE_IDENTITY() as NewId
</cfquery>

<cfdump var="#insert#">

处理此问题的最佳方法是从查询的 result 结构中的 generatedKey 获取主键。

<cfquery name="myQuery" result="queryResult" datasource="#myDSN#">
    INSERT INTO some_table
    (column_one) 
    VALUES 
    (<cfqueryparam value="#stringForColOne#" cfsqltype="CF_SQL_VARCHAR">)
</cfquery>
<cfoutput>
    Generated Key from SQL Insert = #queryResult.generatedKey#
</cfoutput>

https://wikidocs.adobe.com/wiki/display/coldfusionen/cfquery#cfquery-Usage