0

我正在使用没有自动递增标识列的数据库(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 值:

  1. 在 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>
    
  2. 在 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 语句。

有什么区别吗?

4

2 回答 2

1

GENERATED ... AS IDENTITYAS/400 支持在列定义上使用自动递增标识列。

有关更多详细信息,请参阅SQL 参考:CREATE TABLE语句。

于 2011-08-05T20:00:57.330 回答
0

无论哪种方式,您似乎都有重复的可能性。

假设两个用户同时执行相同的操作,查询到最大 id 需要 500ms(很长,但出于示例目的),这不可避免地会产生重复的 id。两种解决方案:

  1. 将 getID 查询和 insert 查询封装在一个事务中。
  2. 使用某种聚集的主键(例如 id 和 date)重做您的表。

至于是否最好将 id 存储为变量,最好说一个问题,“我是否会在此请求的稍后时间使用此 id?”

于 2011-08-06T00:10:14.573 回答