2

クレイジーな質問。知っている。シナリオは次のとおりです。

私のクライアントには、同じ iSeries データベースの同じライブラリにアクセスする ColdFusion Web サイトがいくつかあります。仮に、次の SQL クエリをこれらの Web サイトのいずれからでも実行できるとしましょう。

<cfquery datasource="myDS">
    INSERT INTO XQX.myTable
       (
        x_ID,
        x_Name,
        x_Phone
       )
    VALUES
       (
        #myId#,
        #Name#,
        #Phone#
       )
</cfquery>

(CFQUERYPARAMなどがないことはわかっています。簡単にするために、上記のクエリはA-Okであると仮定しましょう)

挿入の前にテーブルをクエリして最大値を取得し、次のようにインクリメントすることで Id を生成できます。

<cfquery name="qMaxId" datasource="myDS">
    SELECT MAX(x_Id) AS MaxId
    FROM XQX.myTable
</cfquery>

<cfset myId = qMaxId.MaxId + 1 />

しかし、2 人のユーザーが同時にテーブルにアクセスし、両方が同じ「新しい」ID を取得することを心配しています。

何かご意見は?

4

3 に答える 3

3

@X-Zero が指摘した SEQUENCE に加えて、IBM DB2 管理者は IDENTITY と呼ばれる自動インクリメント列をデータベースに配置できます。

create MYTABLE ...
(ID int 
    generated always as IDENTITY(Start with 1 
                                 Increment by 1)
... 
于 2012-03-06T18:58:55.533 に答える
3

Sequence オブジェクトを使用できます。例えば

CREATE SEQUENCE XQX.mySeqObj
    as {numeric-datatype}

データ型は、SMALLINT、INTEGER、BIGINT、DECIMAL、または NUMERIC で、スケールはゼロです (つまり、小数点以下の桁数はありません)。値を格納するためのデータ領域が作成されます。

次のように、NEXT VALUE FOR式を使用してシーケンスを取得およびインクリメントできます。

INSERT INTO XQX.myTable
   (
    x_ID,
    x_Name,
    x_Phone
   )
VALUES
   (
    NEXT VALUE FOR XQX.mySeqObj,
    #Name#,
    #Phone#
   )

現在のセッション内で割り当てられた以前の値を知りたい場合は、式を使用できますがPREVIOUS VALUE FOR mySeqObj、当然、NEXT VALUEセッション内で式を使用した後でのみです。

于 2012-03-06T23:23:20.137 に答える
3

特に Web コンテキストでは、同時ユーザーについて心配する必要があります。MAX()次のよう に ID を生成しようとすると、固有の問題が 2 つあります。

  1. アクセスを「同期」しないと、2 人のユーザーが同じ ID になります。
  2. アクセスを「同期」し、テーブル挿入のボトルネックを作成します

DB2 (通常、iSeries では標準です) には、ID を生成するために照会できるSEQUENCEと呼ばれるものがあります。
コールドフュージョンについては何も知りませんが、次のようなものです。

<cfquery name="qNextId" datasource="myDS"> 
    SELECT NEXTVAL FOR [sequencename] AS NextId 
    FROM Sysibm.Sysdummy1
</cfquery> 

<cfset myId = qNextId.NextId /> 
于 2012-03-06T18:02:29.837 に答える