簡體   English   中英

從多個網站通過SQL插入時,如何自動遞增iSeries數據庫列?

[英]How can I auto increment an iSeries database column when inserting via SQL from several websites?

瘋狂的問題。 我知道。 這是場景:

我的客戶端有幾個ColdFusion網站,它們都在同一個iSeries數據庫中訪問同一個庫。 讓我們說,為了論證,可以從以下任何網站運行以下SQL查詢:

<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 />

但是,我擔心有兩個用戶在同一時間點擊桌面,並且都獲得相同的“新”ID。

有什么想法嗎?

特別是在Web環境中,您應該擔心並發用戶。 嘗試使用MAX()生成id有兩個固有的問題:

  1. 您沒有“同步”訪問權限,兩個用戶最終使用相同的ID。
  2. 執行 “同步”訪問,並為表插入創建瓶頸。

DB2(通常是iSeries上的標准)有一個叫做SEQUENCE的東西,你可以查詢它來生成你的id。
我對coldfusion一無所知,但是這樣的話:

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

<cfset myId = qNextId.NextId /> 

除了@ X-Zero提到的SEQUENCE之外,IBM DB2管理員還可以在數據庫中放置一個名為IDENTITY的自動遞增列。

create MYTABLE ...
(ID int 
    generated always as IDENTITY(Start with 1 
                                 Increment by 1)
... 

您可以使用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表達式之后。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM