2012-08-07 57 views
2

我插入到兩個表中。進入第一張桌子會有一個新的'物品'。有很多領域,但爲了簡單起見,我只會告訴你我需要什麼。這是我的ColdFusion頁:將查詢中的自動增量作爲變量在另一個查詢中使用

<cfquery> 
    INSERT INTO my_item_table (itemid, a bunch of other stuff) 
    VALUES (itemid_sequence.nextval, a bunch of other stuff) 
</cfquery> 

我的問題是我要插入自動增加爲itemid的值到另一個表,文件附件表。同樣的ColdFusion頁:

<cfquery> 
    INSERT INTO my_attachments_table (attachno, itemid, filename) 
    VALUES (attachment_sequence.nextval, **AUTO-INCREMENT VALUE HERE**, '#url.fileName#') 
</cfquery> 

我知道我可以查詢項目表對於剛剛進入第一個表中的值,但即使它是不太可能,有可能是用戶輸入不唯一的,這意味着相同字段的查詢可能會返回多行。在這種情況下,我無法獲得itemid。在查詢中創建的itemid是唯一的唯一標識符。

我的問題是:有沒有辦法將auto = increment設置爲查詢內的值,以便我可以在外部使用它?如果沒有,你會如何建議獲得我的itemid?謝謝。

回答

1

你可以通過檢索下一個序列值到一個變量,這樣的查詢開始:

SELECT itemid_sequence.nextval FROM DUAL 

(DUAL是Oracle的虛擬表)。您可以在兩個INSERT查詢中繼續使用這個變量。

另一種選擇:在數據庫中創建一個存儲過程,它將爲您啓動兩個查詢。

+1

我不是Oracle專家 - 聽起來Danny知道他在說什麼 - 但是當您在一個查詢中插入CF時,然後在下一個查詢中獲取自動增量的結果時,您會遇到併發問題(另一個請求同時增加了字段)。確保並使用交易 - 或者丹尼建議的存儲過程 - 以避免這種可能性。 – 2012-08-07 13:12:26

+1

或者,您可以在插入查詢中獲取增量值*,並將其作爲結果返回。 – 2012-08-07 13:13:42

+0

我該如何將它設置爲一個變量?據我所知,你會cfoutput這個查詢,但沒有列名定義引用。即這將如何工作? 2012-08-07 13:14:03

5

如果在ColdFusion 8/9/10中執行插入操作,它將返回標記結果屬性中插入行(或多行)的ID。例如,如果您使用的是SQL Server,則result_name.IDENTITYCOL是對插入行ID的引用。如果你使用的是MySQL,那就是result_name.GENERATED_KEY。

+0

如果我使用Oracle? – 2012-08-07 13:16:33

+0

在Oracle中它將返回不是表的主鍵的行ID。 – 2012-08-07 13:43:23

+0

老鼠...我總是忘記 - 從cf8開始。很好的布萊恩。 – 2012-08-07 16:20:29