Db2

如何將生成的列添加到 db2 表中?

  • November 17, 2020

我有一張桌子,上面有以下內容:

Columns:
---
URL [nullable, e.g. "https://dba.stackexchange.com/"]
APPFK [nullable, e.g. 654654]
LINKTYPE ["Page", "Link", or "App"]

Check Constraints:
---
(URL IS NULL AND LINKTYPE <> "Link") OR (URL IS NOT NULL AND LINKTYPE = "Link")
(APPFK IS NULL AND LINKTYPE <> "App") OR (APPFK IS NOT NULL AND LINKTYPE = "App")

由於可以根據 URL 和 APPFK 的可空性計算 LinkType,我認為這是計算/生成/虛擬列的絕佳機會。

所以,我試圖執行:

alter table MYLIB.MYTABLE
add column testcol VARCHAR(4) generated always as
(
   CASE
       WHEN URL IS NOT NULL THEN 'LINK'
       WHEN APPFK IS NOT NULL THEN 'APP'
       ELSE 'PAGE'
   END
)

Annnd DB2 向我吐口水:

SQL 狀態:42601 供應商程式碼:-104 消息:

$$ SQL0104 $$令牌 ( 無效。有效令牌:IDENTITY。原因 . . . . : 在令牌 ( 處檢測到語法錯誤。令牌 ( 不是有效令牌。有效令牌的部分列表是 IDENTITY。此列表假定語句在令牌之前是正確的。錯誤可能出現在語句的前面,但語句的語法在這一點上似乎是有效的。恢復…:執行以下一項或多項並再次嘗試請求:- - 驗證token(.)區域的SQL語句。更正語句。錯誤可能是缺少逗號或引號,可能是拼寫錯誤的單詞,也可能與子句的順序有關。-如果錯誤標記是 ,請更正 SQL 語句,因為它沒有以有效子句結尾。

我嘗試執行此 DB2 文件中的第一個範例,但它給了我同樣的錯誤。

怎麼了,這裡?難道我做錯了什麼?文件有錯嗎?僅僅是因為我們的 DB2 已經過時(我們執行的是版本 7,修訂版 1),如果是,是否有解決方法?

不同平台的 Db2 版本往往具有不同的特性和語句語法細節,因此您應該始終查閱文件以了解您的確切數據庫版本和平台。如果這樣做,您將看到您只能對生成的列使用有限的表達式選擇——標識或行更改時間戳。

我建議您使用CASE表達式創建一個視圖,而不是生成的列,以獲取額外的列。

Db2 的平台和版本是什麼?

您連結到的文件適用於 Db2 for Linux/Unix/Windows(又名 LUW)。

db2-midrange標記適用於 IBM i 的 Db2,其CREATE TABLE 文件顯示只能生成以下列。

  • 身份
  • 行更改時間戳
  • 行開始
  • 行尾列
  • 交易開始 ID
  • 生成的表達式

注意:最後四個相對較新,基本上是為了支持最新版本的 Db2 for IBM i (7.4) 中的臨時表而添加的

最後一個可能看起來像您正在嘗試但更深入地探勘,“生成的表達式”是以下“非確定性表達式”之一

  • 數據更改操作(指示插入/更新/刪除的標誌)
  • 特別登記
  • 內置全域變數

引用自:https://dba.stackexchange.com/questions/279784