我正在使用不具有自動遞增標識列的數據庫(iSeries)。因此,我必須在應用程序中即時生成ID。將ColdFusion應用程序生成的標識值插入到iSeries表中的最佳方式是什麼?
我有實現這個對我來說是用戶定義的函數,因爲我需要生成這些ID數表:
<cffunction name="getNewTableId" returntype="numeric" output="false">
<cfargument name="TableName" type="string" required="true" />
<cfargument name="ColumnName" type="string" required="true" />
<cfargument name="SeedNum" type="numeric" required="false" default="1" />
<cfquery name="qMaxId" datasource="#REQUEST.DSN#">
SELECT MAX(#ARGUMENTS.ColumnName#) AS Id
FROM #ARGUMENTS.TableName#
</cfquery>
<cfscript>
if (qMaxId.RecordCount && IsValid("integer", qMaxId.Id))
return qMaxId.Id + 1;
return ARGUMENTS.SeedNum;
</cfscript>
</cffunction>
(我知道這是不是很安全,但是這是bare-骨頭只是爲了得到它的工作詮釋他的開發環境現在)
我的問題是,有什麼好處/從INSERT語句中調用該函數,而不是在本地保存的ID值的缺點:
生成INSERT語句內的ID
<cfquery datasource="#REQUEST.DSN#"> INSERT INTO MyTable ( ID, NameTxt ) SELECT #getNewTableId('MyTable','ID')#, <cfqueryparam value="#FORM.MyName#" cfsqltype="CF_SQL_VARCHAR" maxlength="20" /> </cfquery>
生成ID來INSERT statment之前
<cfset newId = getNewTableId('MyTable','ID') /> <cfquery datasource="#REQUEST.DSN#"> INSERT INTO MyTable ( ID, NameTxt ) SELECT #newId#, <cfqueryparam value="#FORM.MyName#" cfsqltype="CF_SQL_VARCHAR" maxlength="20" /> </cfquery>
我傾向於傾斜朝第一選擇,因爲ColdFusion的威利準備語句並執行它立即,而不是本地存儲值,然後讓ColdFusion準備SQL語句。
有什麼區別嗎?
我看不出什麼區別。在這兩種情況下,CF首先執行'getNewTableId'。然後處理'INSERT'。但是這兩種選擇都不是線程安 – Leigh
DB2有自動增量。請參閱@JamesA鏈接瞭解更多信息。 – corretge
爲什麼他不能爲您添加標識列,可能值得與DBA交談。在我的環境中,原因是RPG和COBOL程序需要重新編譯,因爲它們依賴於數據庫表的佈局(它們遍歷記錄,它們不使用SQL)。爲了解決這個問題,我建立了另一個模式並在那裏重新創建了表,我可以在那裏修改模式,現在我將它們與觸發器綁定在一起... http:// stackoverflow。com/questions/7017355/db2-keeping-n-columns-in-sync-two-tables – Quaternion