私は、自動増分ID列を持たないデータベース(iSeries)で作業しています。したがって、私はアプリケーションでオンザフライでIDを生成する必要があります。iSeriesテーブルにColdFusionアプリケーション生成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>
骨はちょうどそれが今の彼の開発環境をint作業得るために)
私の質問があり、何のメリット/ローカルID値を保存するとは対照的に、INSERT文の中から関数を呼び出すの欠点:。
ColdFusionのウィリーは、文を準備して実行するので、私は、最初のオプションの方に傾く傾向にあるなステートメント
<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>
を挿入するために前にIDを生成するINSERTなステートメント内
<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を生成します値をローカルに格納するのではなく、直ちにColdFusionでSQL文を準備します。
違いがありますか?
私はほとんど違いが見えません。どちらの場合も、CFは最初に 'getNewTableId'を実行します。その後、 'INSERT'を処理します。しかしどちらのオプションもスレッドセーフではありません。 – Leigh
DB2には自動インクリメントがあります。詳細については、@JamesAリンクを参照してください。 – corretge
IDAがなぜあなたのために追加できないのか、DBAと話し合う価値があります。私の環境では、RPGとCOBOLプログラムを再コンパイルする必要があるのは、DB表のレイアウトに依存する(レコードを反復し、SQLを使用しないためです)。これを乗り越えるために、別のスキーマを設定してそこにテーブルを再作成しました。スキーマを変更できるようになりましたが、今はそれらをトリガーと結びつけています... http:// stackoverflow。com/questions/7017355/db2-keeping-n-columns-in-two-tables間 – Quaternion