我正在使用没有自动递增标识列的数据库(iSeries)。因此,我必须在应用程序中即时生成 ID。
我有一个用户定义的函数可以为我完成这项工作,因为我需要为几个表生成这些 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>
(我知道这不是很安全,但这只是为了让它现在在他的开发环境中工作。)
我的问题是,从 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>
在 INSERT 语句之前生成 ID
<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 语句。
有什么区别吗?