INSERT INTO从当前获取主键ID

时间:2015-03-04 19:23:34

标签: sql-server coldfusion

在ColdFusion中工作时,如何从最近的查询中返回主键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返回主键的值,该主键是名为ID的列。

3 个答案:

答案 0 :(得分:8)

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

在SQL Server中,SCOPE_IDENTITY()返回在当前作用域内创建的最后一条记录的ID,而不管表格如何。

所以你的功能应该更像这样:

  1. 您应该将值作为函数的参数传递(包括数据类型和所需的值)。
  2. 您的值应使用CFQUERYPARAM来防止SQL注入攻击。
  3. 您的功能应包括output="false"
  4. 您的函数的返回类型应为numeric,因为您返回一个整数值(新主键)。
  5. <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

答案 1 :(得分:3)

如果您使用的是最新版本的Microsoft SQL Server,则可以将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>

答案 2 :(得分:2)

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