2011-10-22 63 views
11
插入後

我插入到一個表,然後獲取ID後面,這樣我可以插入到另一臺正常的過程是這樣的MSSQL:獲取表ID使用ColdFusion和MySQL

DECLARE @transactionKey uniqueidentifier 
SET @transactionKey = NEWID() 

INSERT INTO transactions(transactionKey, transactionDate, transactionAmount) 
    VALUES(@transactionKey, '#transactionDate#', '#transactionAmount#') 

DECLARE @transactionID int 
SELECT @transactionID = transactionID 
    FROM transactions 
    WHERE transactionKey = @transactionKey 


INSERT INTO transactionItems(transactionID, itemID, itemAmount) 
    VALUES(@transactionID, '#itemID#', '#itemAmount#') 


SELECT @transactionID as transactionID 

我的問題是2部分。首先,這是做這件事的最好方法嗎?我讀到,有可能我的GUID發生變化,最終在第二個表中導致一個無效的GUID。我認爲這個機會非常渺茫,而且我在多個項目上多年來一直這樣做,並且從來沒有遇到過問題。

我的問題的第二部分是做這樣的工作在MySQL嗎?我正在開始使用MySQL開發一個新項目,我並不完全確定這是最好的方式。過去我通常只使用MSSQL。

我在這個新項目上使用CF9和MySQL。

對此的任何幫助將是偉大的。

在此先感謝。

+0

回覆:*我讀,有一個機會,GUID *你在哪裏讀到關於我的變化? – Leigh

回答

23

第1部分: 我個人不會在單個查詢中批量多個語句以降低SQL注入的風險。這是ColdFusion管理員數據源中的一個設置。執行一個存儲過程(可能是你在做什麼(?))是另一回事,但是,如果這是你的意圖,你應該將你的問題改爲「在使用mySQL存儲過程插入後獲取主鍵」。

第2部分: ColdFusion的,像很多的東西,使得獲取新插入記錄的主鍵很容易 - 即使你正在使用自動增量鍵的GUID或類似Oracle的ROWNUM。這將適用於Adobe ColdFusion支持的幾乎所有數據庫,包括MSSQL或MySQL。唯一的例外是數據庫的版本 - 例如,MySQL 3不支持這個;但是,MySQL 4+會。

<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> 

由於CF9 +,你可以使用通用密鑰名稱訪問新的ID(對任何數據庫):

result.GENERATEDKEY // All databases 

對於CF8,不同的數據庫就會有結果值內不同的密鑰。這裏有一個簡單的表格來幫助我從cfquery documentation中複製出來。

result.identitycol // MSSQL 
result.rowid   // Oracle 
result.sys_identity // Sybase 
result.serial_col  // Informix 
result.generated_key // MySQL 

如果您有任何問題,你可以看到一個漂亮的轉儲如下:

<cfdump var="#result#" /> 
+0

+1的「結果」屬性,使用cfqueryparam和分裂的查詢到更細緻的服務。 –

+0

@aaron謝謝!我不知道爲什麼我這麼長時間以來一直這樣做。這很容易。 – Sequenzia

+0

我不知道爲什麼,但我從來沒有能夠得到result.generatedKey爲我工作。使用result.generated_key可以正常工作。 – Yisroel

1

這裏是MSSQL一個快速解決方案。它使用SCOPE_IDENTITY()函數,該函數返回在前一個插入語句中插入的最後一行的ID。

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> 
+0

的感謝!我喜歡這種方式也比我以前做的其他方式更好。這對存儲過程很有用。 – Sequenzia

0

getGeneratedKey function at cflib.org可以與大多數數據庫一起使用:

實施例:

<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> 
0

作爲每@亞倫-格林利答案, r INSERT查詢的esult變量包含一個鍵值對,該鍵值對是插入行的自動生成ID; this is available only for databases that support this feature.

而且下面是返回插入的記錄所有數據庫的可能方式。

<cfquery result="result"> 
    INSERT INTO myTable (
     title 
    ) 
    OUTPUT INSERTED.* 
    VALUES (
    <cfqueryparam value="Nice feature!" cfsqltype="cf_sql_varchar"> 
    ) 
</cfquery> 

您將得到的結果插入記錄的詳細信息。

希望這會有所幫助。謝謝。