[英]How can I remove the ID column from a local sql table or change it to AUTO INCREMENT?
[英]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有兩個固有的問題:
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.