INSERT INTO 从当前获取主键 ID

INSERT INTO get primary key ID from current

在 ColdFusion 中工作时,如何return 来自最近查询的主键 ID 值?

例如:

<cffunction name="addAction" access="public" returntype="string">
  <cfquery name="newAction" datasource="RC">

    INSERT INTO myTable (name,address,title) VALUE (#fname#,#address#,#usrtitle#);

  </cfquery>

  <cfset actionUpdateID = #result_name.IDENTITYCOL#>

  <cfreturn actionUpdate>
</cffunction>

在上面的示例中,我试图获取 actionUpdate 到 return 主键的值,这是一个名为 ID.

的列

如果您使用的是较新版本的 Microsoft SQL 服务器,您可以将 OUTPUT INSERTED.columnname 与您的身份列一起使用,如下所示:

<cfquery name="newAction" datasource="RC">
INSERT INTO myTable 
(
  name,
  address,
  title
) 
OUTPUT INSERTED.ID
VALUES 
(
  #fname#,
  #address#,
  #usrtitle#
)
</cfquery>

<cfset actionUpdateID = newAction.person_id>

该示例假定 ID 是您的身份列。

(不用说你应该用<cfqueryparam ...>。)


或者,假设您使用的是相当新的 ColdFusion 版本,CFQUERY 返回的元数据包括插入时的标识,只要您为 result="" 属性定义名称即可。如果您使用 myResult 作为结果变量的名称,您可以使用(取决于您的数据库风格):

myResult.IDENTITYCOL    SQL Server only. The ID of an inserted row.

myResult.ROWID          Oracle only. The ID of an inserted row. This is not
                        the primary key of the row, although you can retrieve
                        rows based on this ID.

myResult.SYB_IDENTITY   Sybase only. The ID of an inserted row.

myResult.SERIAL_COL     Informix only. The ID of an inserted row.

myResult.GENERATED_KEY  MySQL only. The ID of an inserted row. MySQL 3 
                        does not support this feature.

myResult.GENERATEDKEY   Supports all databases. The ID of an inserted row.

(ColdFusion documentation)

所以上面的例子看起来像这样:

<cfquery name="newAction" datasource="RC" result="queryResults">
INSERT INTO myTable 
(
  name,
  address,
  title
) 
VALUES 
(
  #fname#,
  #address#,
  #usrtitle#
)
</cfquery>

<cfset actionUpdateID = queryResults.IDENTITYCOL>

我写了“Please stop using SELECT MAX(id)”来解决这个问题。每个数据库都有一个内置函数,它将 return 新插入的记录的主键 table.

在SQL服务器中,SCOPE_IDENTITY() returns是在当前范围内创建的最后一条记录的ID,与table无关。

所以你的函数应该看起来更像这样:

  1. 您应该将值作为函数的参数传递(包括数据类型和所需值)。
  2. 您的值应该使用 CFQUERYPARAM 来防止 SQL 注入攻击。
  3. 您的函数应包括 output="false"
  4. 你的函数的 return 类型应该是 numeric 因为你 return 是一个整数值(新的主键)。
<cffunction name="addAction" access="public" output="false" returntype="numeric">
    <cfargument name="fname" type="string" required="true">
    <cfargument name="address" type="string" required="true">
    <cfargument name="usrtitle" type="string" required="true">
    <cfquery name="newAction" datasource="RC">
        INSERT INTO myTable (
            name,
            address,
            title
        ) 
        VALUE (
            <cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.fname#">,
            <cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.address#">,
            <cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.usrtitle#">
        );
        // Return the new primary key for this record.
        SELECT SCOPE_IDENTITY() AS NEW_ID;
    </cfquery>
    <cfreturn newAction.NEW_ID >
</cffuntion>

FWIW,MySQL 具有功能 LAST_INSERT_ID() 做同样的事情。您必须在 CF Admin 中将数据源中的设置更新为 allow MySQL to run multiple statements

尝试将结果属性添加到您的 cfquery 标记。它应该包含您要查找的 id 字段。