Я работаю с базой данных (iSeries), в которой нет автоматически увеличивающихся столбцов идентификаторов. Таким образом, я должен генерировать идентификатор на лету в приложении.
У меня есть пользовательская функция, которая выполняет это для меня, поскольку мне нужно сгенерировать эти идентификаторы для нескольких таблиц:
<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 по сравнению с локальным сохранением значения идентификатора:
Создание идентификатора внутри INSERT statment
<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
<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.
Есть ли разница?