My normal process for inserting into one table and then getting the ID back so that I can insert into another table is like this in MSSQL:
DECLARE @transacti
The getGeneratedKey function at cflib.org can be used with most databases:
Example:
<cfquery name="insertArtist" datasource="cfartgallery" result="r"> insert into artists (firstName, lastName) values('todd','sharp') </cfquery> <cfquery name="getArtists" datasource="cfartgallery"> select * from artists </cfquery> <cfdump var="#getArtists#"> <cfoutput>#getGeneratedKey(r)#</cfoutput> <cffunction name="getGeneratedKey" hint="I normalize the key returned from cfquery" output="false"> <cfargument name="resultStruct" hint="the result struct returned from cfquery" /> <cfif structKeyExists(arguments.resultStruct, "IDENTITYCOL")> <cfreturn arguments.resultStruct.IDENTITYCOL /> <cfelseif structKeyExists(arguments.resultStruct, "ROWID")> <cfreturn arguments.resultStruct.ROWID /> <cfelseif structKeyExists(arguments.resultStruct, "SYB_IDENTITY")> <cfreturn arguments.resultStruct.SYB_IDENTITY /> <cfelseif structKeyExists(arguments.resultStruct, "SERIAL_COL")> <cfreturn arguments.resultStruct.SERIAL_COL /> <cfelseif structKeyExists(arguments.resultStruct, "GENERATED_KEY")> <cfreturn arguments.resultStruct.GENERATED_KEY /> <cfelse> <cfreturn /> </cfif> </cffunction>
For MSSQL both of the following will return the new primary key
<cfset NewPrimaryKey = result.generatedkey> OR
<cfset NewPrimaryKey = result.identitycol>
As per the answer of @aaron-greenlee, The result variable of INSERT queries contains a key-value pair that is the automatically generated ID of the inserted row; this is available only for databases that support this feature.
And the below is possible way to return the inserted record for all databases.
<cfquery result="result">
INSERT INTO myTable (
title
)
OUTPUT INSERTED.*
VALUES (
<cfqueryparam value="Nice feature!" cfsqltype="cf_sql_varchar">
)
</cfquery>
You will get the inserted record details in result.
Hope this helps. Thanks.
Here is a quick solution for MSSQL. It uses the SCOPE_IDENTITY() function that returns the ID of the last row inserted in the previous insert statement.
http://msdn.microsoft.com/en-us/library/ms190315.aspx
<cfquery>
DECLARE @iNewGeneratedID INT
INSERT INTO transactions
(
transactionDate,
transactionAmount
)
VALUES
(
<cfqueryparam value="#transactionDate#" type="cf_sql_date">,
<cfqueryparam value="#transactionAmount#" type="cf_sql_integer">
)
SET @iNewGeneratedID = SCOPE_IDENTITY()
INSERT INTO transactionItems
(
transactionID,
itemID,
itemAmount
)
VALUES
(
@iNewGeneratedID,
<cfqueryparam value="#itemID#" type="cf_sql_integer">,
<cfqueryparam value="#itemAmount#" type="cf_sql_integer">
)
SELECT @iNewGeneratedID AS iNewGeneratedID
</cfquery>
Part 1: I would personally not batch multiple statements within a single query to reduce the risk of SQL injection. This is a setting within your datasource on the ColdFusion administrator. Executing a stored procedure, which might be what you are doing(?), is another story, but, you should rephrase your question to "Get primary key after insert with mySQL Stored Procedure" if that is your intention.
Part 2: ColdFusion, like many things, makes getting the primary key for a newly inserted record very easy--even if you are using auto-increment keys, GUIDs or something like Oracle's ROWNUM. This will work on any almost every database supported by Adobe ColdFusion including MSSQL or MySQL. The only exception is the version of the databse--for example, MySQL 3 will not support this; however, MySQL 4+ will.
<cfquery result="result">
INSERT INTO myTable (
title
) VALUES (
<cfqueryparam value="Nice feature!" cfsqltype="cf_sql_varchar">
)
</cfquery>
<--- get the primary key of the inserted record --->
<cfset NewPrimaryKey = result.generatedkey>
As of CF9+, you can access the new ID (for any database) using the generic key name:
result.GENERATEDKEY // All databases
For CF8, different databases will have different keys within the results value. Here is a simple table to help I copied from the cfquery documentation.
result.identitycol // MSSQL
result.rowid // Oracle
result.sys_identity // Sybase
result.serial_col // Informix
result.generated_key // MySQL
If you have any questions you can see a pretty dump as follows:
<cfdump var="#result#" />