Каков наилучший способ вставить значение идентификатора, созданного приложением ColdFusion, в таблицу iSeries? - PullRequest
0 голосов
/ 05 августа 2011

Я работаю с базой данных (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 по сравнению с локальным сохранением значения идентификатора:

  1. Создание идентификатора внутри 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>
    
  2. Создание идентификатора перед вставкой 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.

Есть ли разница?

Ответы [ 2 ]

1 голос
/ 06 августа 2011

AS / 400 поддерживает автоматическое увеличение столбцов идентификаторов с использованием GENERATED ... AS IDENTITY в определении столбца.

Подробнее см. В справочнике по SQL : CREATE TABLE .

0 голосов
/ 06 августа 2011

В любом случае у вас есть возможность дублирования.

Допустим, два пользователя выполняют одно и то же действие одновременно, и запрос на получение максимального идентификатора занимает 500 мс (долгое время, но для примера), это неизбежно создаст дубликат идентификатора. Два решения:

  1. Инкапсулирует как запрос getID, так и запрос вставки в транзакции.
  2. Повторите вашу таблицу, используя некий кластерный первичный ключ, такой как id и дата.

Насколько лучше хранить идентификатор как переменную или нет, лучше задать вопрос: «Собираюсь ли я использовать этот идентификатор в любой момент позже в этом запросе?»

...