Database

如何找到自動增量列的下一個生成值?

  • December 18, 2012

我在使用 IBM DB2 的自動增量列時遇到了一些麻煩。起初,我的所有列都被定義為GENERATED ALWAYS,但由於我在使用“db2 import …”命令時遇到了這個問題,我將它們更改為GENERATED BY DEFAULT。這是必要的,因為我需要 ID 保持一致,因為其他表引用它們。因此,不能使用“db2 import … modified by identityignore …”。

當我現在導入數據時,ID 被正確插入,但每次我這樣做時,我必須記住通過獲取最高的 Id+1 為自動增量列設置一個新的開始,並像這樣更改列:

SELECT MAX(mycolumn)+ 1 FROM mytable;
ALTER TABLE mytable ALTER COLUMN mycolumn RESTART WITH <above_result>;

如果我忘記了這一點,插入語句將因重複 PK 錯誤而失敗,因為自動增量列是主鍵。

所以我的問題是:有沒有辦法找到自動增量列的下一個值,所以我可以編寫語句來檢查,如果這個值小於 SELECT MAX 並且需要設置?

或者:這整個事情不是像我想像的那麼複雜嗎?我可以以某種方式導入數據,保留 ID 並讓自動增量列仍然按預期工作嗎?

蒂姆,我遇到了同樣的問題,我需要將身份重新啟動到下一個值。我使用的是 db2v9.1。

不幸的是,沒有辦法自動指定下一個值。根據 DB2 文件,該值應該是“數字常量”。因此我必須做一個選擇 max(id),獲取值並手動替換它在 alter..restart stmt 中。

我不記得我是否嘗試過這個 - 但你可以編寫一個 sp,其中 max(id) 設置在一個變數中,並在 alter…restart stmt 中分配該變數。(我無法嘗試,因為我不再有權訪問任何 db2 數據庫)。我懷疑它會起作用。(如果有效,請告訴我:))

DB2 參考:

RESTART 或 RESTART WITH numeric-constant

重置與標識列關聯的序列的狀態。如果未指定 WITH numeric-constant,則標識列的序列在最初創建標識列時隱式或顯式指定的值重新開始。該列必須存在於指定的表中 (SQLSTATE 42703),並且必須已經使用 IDENTITY 屬性 (SQLSTATE 42837) 進行了定義。RESTART 不會更改原始的 START WITH 值。

numeric-constant 是一個精確的數字常量,可以是可以分配給該列的任何正值或負值 (SQLSTATE 42815),小數點右側不存在非零數字 (SQLSTATE 428FA)。numeric-constant 將用作該列的下一個值。

引用自:https://serverfault.com/questions/20389