我有一個包含數千行的iSeries表,並且新的數字/整數列僅作爲表鍵添加。這基本上是一個整數id列(1,2,3 ...)。是否可以爲沒有循環的iSeries表中的每一行生成一個唯一的數值?
假設我不能將此列設置爲自動遞增列。是否有一種簡單的方法可以爲每行分配唯一的增量值,而無需遍歷每個賦值的記錄?也許某種更新查詢?
我有一個包含數千行的iSeries表,並且新的數字/整數列僅作爲表鍵添加。這基本上是一個整數id列(1,2,3 ...)。是否可以爲沒有循環的iSeries表中的每一行生成一個唯一的數值?
假設我不能將此列設置爲自動遞增列。是否有一種簡單的方法可以爲每行分配唯一的增量值,而無需遍歷每個賦值的記錄?也許某種更新查詢?
可以使用RRN標量函數指定的相對記錄號:
update table set id=rrn(table)
你可以使用Sequence對象。例如
CREATE SEQUENCE MySeq
as {numeric-datatype}
的數據類型可以是SMALLINT,INTEGER,BIGINT,DECIMAL或NUMERIC,用零(即沒有小數位)的規模。數據區域被創建以存儲該值。
然後,您可以使用一個NEXT VALUE FOR
表達檢索和遞增的順序,在
UPDATE MyTable SET id = NEXT VALUE FOR MySeq
如果你想知道分配您可以使用表達式Previous value for mySeq
的最後一個值此方法不會與RRN()一樣快,但在某些情況下可能有用,例如當您希望在不同表格中有唯一的數字時。
在一些快速測試中,我發現這種方法很容易使用MAX(id)。 – WarrenT 2013-01-17 00:44:03
也許最簡單的[和最快]是,添加新的列 [即不能是一個自動增量柱]時,要添加列GENERATED ALWAYS AS IDENTITY
[從而是一個自動增量柱],然後ALTER TABLE
至DROP IDENTITY
該列的屬性,使得該列爲不再是自動遞增的列。無需創建單獨的SEQUENCE。當然,一定要首先進行測試,並重復使用TABLE進行更改,最好在該副本中使用一小部分數據[所以測試實際上也必須處理數據],最後查看DEFAULT和NULL首選項等列屬性;即ADD COLUMN
和/或ALTER COLUMN
的要求可能不同於以下給出的僅作爲簡單的示例[在v5r3上用DB2 for i5/OS驗證;推測成功通過DB2 for IBM i 7.3]:
alter table has_no_id /* err, will have ID column, afterward */
add column id_added integer generated always as identity
;
alter table has_no_id /* err, will since, have no ID column */
alter column id_added drop identity
;
+1我刪除了我的答案,因爲它沒有添加任何值。 – Paparazzi 2012-02-20 22:37:53
如果物理文件設置爲不重複使用已刪除的記錄,然後有人在其上執行了RGZPFM,是否可以導致RRN發生更改,從而允許ID列中出現重複值的可能性? – 2012-02-29 19:04:20
@Tracy如果文件得到重新組織,RRN解決方案不會持續正常工作。在這種情況下,他們可以使用RRN來初始分配鍵,然後使用子查詢來計算MAX(id)+ 1。 – jamesallman 2012-02-29 19:16:20