INSERT INTO从当前获取主键ID

Den*_*one 2 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>
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,我试图actionUpdate返回主键的值,该主键是一个名为的列ID.

Adr*_*eno 8

我写了" 请停止使用SELECT MAX(id) "来解决这个问题.每个数据库都有一个内置函数,它将返回表中新插入记录的主键.

在SQL Server中,SCOPE_IDENTITY()返回在当前作用域内创建的最后一条记录的ID,而不管表是什么.

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

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

FWIW,MySQL具有LAST_INSERT_ID()做同样事情的功能.您必须在CF Admin中更新数据源中的设置,以允许MySQL运行多个语句.