在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
的列。
答案 0 :(得分:8)
我写了“Please stop using SELECT MAX(id)”来解决这个问题。每个数据库都有一个内置函数,它将在表上返回新插入记录的主键。
在SQL Server中,SCOPE_IDENTITY()
返回在当前作用域内创建的最后一条记录的ID,而不管表格如何。
所以你的功能应该更像这样:
CFQUERYPARAM
来防止SQL注入攻击。output="false"
。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>
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.
所以上面的例子看起来像这样:
<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字段。