CREATE TABLE
CREATE TABLE 陳述式會在現行伺服器上定義表格。 定義必須包含其名稱及其直欄的名稱和屬性。 定義可能包括表格的其他屬性,例如主要索引鍵。
呼叫
此陳述式可以內嵌在應用程式中,或以互動方式發出。 它是可動態準備的可執行陳述式。
授權
陳述式的授權 ID 所保留的專用權必須至少包含下列其中一項:
- 在綱目中建立的專用權。 如需相關資訊,請參閱 在綱目中建立所需的專用權。
- 資料庫管理者權限
陳述式的授權 ID 所保留的專用權必須至少包含下列其中一項:
- 下列系統權限:
- *USE 至「建立實體檔 (CRTPF)」指令
- 如果在其中建立表格的檔案庫是具有資料字典的 SQL 綱目,則對資料字典使用 *CHANGE
- 資料庫管理者權限
如果已指定 SQL 名稱,且存在與建立表格所在之檔案庫同名的使用者設定檔,且該名稱與陳述式的授權 ID 不同,則陳述式的授權 ID 所保留的專用權必須至少包含下列其中一項:
- 具有該名稱之使用者設定檔的系統權限 *ADD
- 資料庫管理者權限
若要定義外部索引鍵,陳述式授權 ID 所保留的專用權必須至少包括母表格上的下列其中一項:
- 表格的 REFERENCES 專用權或物件管理權限
- 指定母索引鍵的每一個直欄上的 REFERENCES 專用權
- 表格的所有權
- 資料庫管理者權限
如果定義欄位程序,則陳述式的授權 ID 所保留的專用權必須至少包括下列其中一項:
- 下列系統權限:
- 程式的系統權限 *EXECUTE ,以及
- 包含程式之綱目的 USAGE 專用權
- 資料庫管理者權限
如果指定 LIKE 子句或 select-statement ,則陳述式授權 ID 所保留的專用權必須至少包括這些子句中所指定表格或視圖的下列其中一項:
- 表格或視圖的 SELECT 專用權
- 表格或視圖的所有權
- 資料庫管理者權限
如果參照特殊類型,則陳述式的授權 ID 所保留的專用權必須至少包括下列其中一項:
- 對於陳述式中所識別的每一個特殊類型:
- 特殊類型的 USAGE 專用權,以及
- 包含特殊類型之綱目的 USAGE 專用權
- 資料庫管理者權限
若要取代現有表格,陳述式的授權 ID 所保留的專用權必須至少包括下列其中一項:
- 下列系統權限:
- 表格上 *OBJMGT 的系統權限
- DROP 表格所需的所有權限
- 資料庫管理者權限
如需對應於 SQL 專用權之系統權限的相關資訊,請參閱 檢查表格或視圖的專用權時對應的系統權限 及 檢查特殊類型的專用權時對應的系統權限。
語法
說明
- 或替換
- 指定如果表格定義存在於現行伺服器上,則取代該表格的定義。 在型錄中取代新定義之前,會有效地變更現有定義。在下列情況下,存在表格的定義:
- 已指定 FOR SYSTEM NAME ,且 system-object-identifier 符合現有表格的 system-object-identifier 。
- 未指定 FOR SYSTEM NAME ,且 table-name 是符合現有表格之 system-object-identifier 的系統物件名稱。
如果現行伺服器上不存在表格的定義,則會忽略此選項。
- 表格名稱
- 命名表格。 名稱 (包括隱含或明確限定元) 不得識別現行伺服器上已存在的別名、檔案、索引、表格或視圖。
如果指定 SQL 名稱,則會在隱含或明確限定元指定的綱目中建立表格。
如果指定系統名稱,則會在限定元指定的綱目中建立表格。 如果不合格:
- 如果 CURRENT SCHEMA 特別暫存器的值是 *LIBL ,則會在現行檔案庫 (*CURLIB) 中建立表格。
- 否則,將在現行綱目中建立表格。
- FOR SYSTEM NAME system-object-identifier
- 識別表格的 system-object-identifier 。 system-object-identifier 不得與現行伺服器上已存在的表格、視圖、別名或索引相同。 system-object-identifier 必須是不完整的系統 ID。
當指定 system-object-identifier 時, table-name 不能是有效的系統物件名稱。
直欄定義
定義直欄的屬性。 至少必須有一個直欄定義,且不超過 8000 個直欄定義。
直欄的列緩衝區位元組計數總和不得大於 32766 ,如果指定 VARCHAR、VARGRAPHIC 或 VARBINARY 直欄,則不得大於 32740。 此外,如果指定 LOB 或 XML 直欄,則在插入或更新時,直欄的列資料位元組計數總和不得大於 3 758 096 383。 如需根據資料類型的直欄位元組計數的相關資訊,請參閱 列大小上限。
- 直欄名稱
- 命名表格的直欄。 請勿限定 column-name ,且不要對表格的多個直欄或表格的 system-column-name 使用相同的名稱。
- FOR COLUMN system-column-name
- 提供直欄的 IBM® i 名稱。 請勿對表格的多個直欄或表格的直欄名稱使用相同的名稱。
如果未指定 system-column-name ,且 column-name 不是有效的 system-column-name ,則會產生系統直欄名稱。 如需如何產生系統直欄名稱的相關資訊,請參閱 產生直欄名稱的規則。
- 資料類型
- 指定直欄的資料類型。
- 內建類型
- 若為 內建類型,請使用:
- SMALLINT
- 若為小整數。
- INTEGER 或 INT
- 若為大整數。
- BIGINT
- 若為大整數。
- DECIMAL (integer,integer) 或 DEC (integer,整數)
- DECIMAL (integer) 或 DEC (integer)
- DECIMAL 或 DEC
- 代表聚集十進位數。 第一個整數是數字的精準度; 即總位數; 範圍從 1 到 63。 第二個整數是數字的小數位數 (小數點右邊的位數)。 它的範圍可以從 0 到數字的精準度。
您可以將 DECIMAL (p) 用於 DECIMAL (p, 0) ,並將 DECIMAL 用於 DECIMAL (5, 0)。
- NUMERIC (integer,integer) 或 NUM (integer,整數)
- NUMERIC (integer) 或 NUM (integer)
- NUMERIC 或 NUM
- 若為區化十進位數。 第一個整數是數字的精準度,亦即總位數; 範圍從 1 到 63。 第二個整數是數字的小數位數 (小數點右側的位數)。 它的範圍可以從 0 到數字的精準度。
您可以將 NUMERIC (p) 用於 NUMERIC (p, 0) ,並將 NUMERIC 用於 NUMERIC (5, 0)。
- FLOAT
- 適用於倍精準度浮點數字。
- FLOAT (integer)
- 適用於單精準度或倍精準度浮點數字,視整數值而定。 整數值必須在 1 到 53 的範圍內。 值 1 到 24 表示單一精準度,值 25 到 53 表示倍精準度。 預設值為 53。
- REAL
- 適用於單精準度浮點。
- DOUBLE 精準度 或 DOUBLE
- 適用於倍精準度浮點。
- DECFLOAT (integer)
- DECFLOAT
- 適用於 IEEE 十進位浮點數字。 integer 的值必須是 16 或 34 ,並且代表可以儲存的有效位數。 如果省略 integer ,則 DECFLOAT 直欄將能夠代表 34 個有效位數。
- CHARACTER (integer) 或 CHAR (integer)
- 字元 或 CHAR
- 對於長度為 integer bytes的固定長度字串。 整數範圍可以從 1 到 32766 (32765 如果容許空值)。 如果指定 FOR MIXED DATA 或混合資料 CCSID ,則範圍是 4 到 32766 (32765 如果容許空值)。 如果省略長度規格,則會假設長度為 1。
- CHARACTER VARYING (整數) 或 CHAR VARYING (整數) 或 VARCHAR (整數)
- 適用於長度上限為 整數 位元組的可變長度字串,範圍從 1 到 32740 (32739 ,如果容許空值的話)。 如果指定 FOR MIXED DATA 或混合資料 CCSID ,則範圍是 4 到 32740 (32739 ,如果容許空值)。
- 字元大型物件 (整數[K | M | G]) 或 CHAR 大型物件 (整數[K | M | G]) 或 CLOB (整數[K | M | G])
- 字元大型物件 或 CHAR 大型物件 或 CLOB
- 對於具有指定長度上限 (以位元組為單位)的字元大型物件字串。 最大長度必須在 1 到 2 147 483 647 的範圍內。 如果指定 FOR MIXED DATA 或混合資料 CCSID ,則範圍是 4 到 2 147 483 647。 如果省略長度規格,則會假設長度為 1 MB。 分散式表格中不容許 CLOB。
- 整數
- 整數的最大值為 2 147 483 647。 字串的長度上限為 integer。
- 整數 K
- 整數的最大值是 2 097 152。 字串長度上限為 1024 倍 integer。
- 整數 M
- 整數的最大值是 2 048。 字串長度上限為 1 048 576 次 integer。
- 整數 G
- 整數的最大值為 2。 字串的長度上限為 1 073 741 824 乘以 整數。
- GRAPHIC (integer)
- GRAPHIC
- 對於長度為 integer的固定長度圖形字串,範圍從 1 到 16383 (如果容許空值,則為 16382)。 如果省略長度規格,則會假設長度為 1。
- VARGRAPHIC (整數) 或 GRAPHIC VARYING (整數)
- 對於長度上限為 integer的可變長度圖形字串,其範圍為 1 到 16370 (如果容許空值,則為 16369)。
- DBCLOB (integer[K | M | G])
- DBCLOB
- 對於具有指定長度上限的雙位元組字元大型物件字串。
長度上限必須在 1 到 1 073 741 823 的範圍內。 如果省略長度規格,則會假設長度為 1 MB。 分散式表格中不容許 DBCLOB。
- 整數
- 整數的最大值為 1 073 741 823。 字串的長度上限為 integer。
- 整數 K
- 整數的最大值為 1 028 576。 字串長度上限為 1024 倍 integer。
- 整數 M
- 整數的最大值是 1 024。 字串長度上限為 1 048 576 次 integer。
- 整數 G
- 整數的最大值為 1。 字串的長度上限為 1 073 741 824 乘以 整數。
- NATIONAL CHARACTER (整數) 或 NATIONAL CHAR (整數) 或 NCHAR (整數)
- 國家字元 或 國家字元 或 NCHAR
- 對於長度為 integer的固定長度 Unicode 圖形字串,其範圍為 1 至 16383 (如果容許空值,則為 16382)。 如果省略長度規格,則會假設長度為 1。 CCSID 是 1200。
- NATIONAL CHARACTER VARYING (整數) 或 NATIONAL CHAR VARYING (整數) 或 NCHAR VARYING (整數) 或 NVARCHAR (整數)
- 對於長度上限為 integer的可變長度 Unicode 圖形字串,其範圍從 1 到 16370 (如果容許空值,則為 16369)。 CCSID 是 1200。
- 國家字元大型物件 (整數[K | M | G]) 或 NCHAR 大型物件 (整數[K | M | G]) 或 NCLOB (整數[K | M | G])
- 國家字元大型物件 或 NCHAR 大型物件 或 NCLOB
- 對於指定長度上限的 Unicode 雙位元組字元大型物件字串。
長度上限必須在 1 到 1 073 741 823 的範圍內。 如果省略長度規格,則會假設長度為 1 MB。 CCSID 是 1200。 分散式表格中不容許 NCLOB。
- 整數
- 整數的最大值為 1 073 741 823。 字串的長度上限為 integer。
- 整數 K
- 整數的最大值為 1 028 576。 字串長度上限為 1024 倍 integer。
- 整數 M
- 整數的最大值是 1 024。 字串長度上限為 1 048 576 次 integer。
- 整數 G
- 整數的最大值為 1。 字串的長度上限為 1 073 741 824 乘以 整數。
- BINARY (integer)
- BINARY
- 對於長度為 integer的固定長度二進位字串。 整數範圍可以從 1 到 32766 (32765 如果容許空值)。 如果省略長度規格,則會假設長度為 1。
- BINARY VARYING (integer) 或 VARBINARY (integer)
- 對於長度上限為 integer的可變長度二進位字串,其範圍為 1 到 32740 (32739 ,如果容許空值)。
- BLOB(整數[K | M | G]) 或 二進位大型物件 (整數[K | M | G])
- BLOB 或 二進位大型物件
- 對於指定長度上限的二進位大型物件字串。 最大長度必須在 1 到 2 147 483 647 的範圍內。 如果省略長度規格,則會假設長度為 1 MB。 分散式表格中不容許 BLOB。
- 整數
- 整數的最大值為 2 147 483 647。 字串的長度上限為 integer。
- 整數 K
- 整數的最大值是 2 097 152。 字串長度上限為 1024 倍 integer。
- 整數 M
- 整數的最大值是 2 048。 字串長度上限為 1 048 576 次 integer。
- 整數 G
- 整數的最大值為 2。 字串的長度上限為 1 073 741 824 乘以 整數。
- DATE
- 約會
- 時間
- 有一段時間
- TIMESTAMP(整數) or TIMESTAMP
- 代表時間戳記。 整數必須介於 0 和 12 之間,並指定從 0 (秒) 到 12 (picoseconds) 的小數秒精準度。 預設值為 6 (微秒)。
BOOLEAN
若為布林值。
- DATALINK (integer ) 或 DATALINK
- 對於指定長度上限的 DataLink 。 最大長度必須在 1 到 32717 的範圍內。 如果指定 FOR MIXED DATA 或混合資料 CCSID ,則範圍是 4 到 32717。 指定的長度必須足夠包含最大預期 URL 及任何 DataLink 註解。 如果省略長度規格,則假設長度為 200。 分散式表格中不容許 DATALINK。
DATALINK 值是具有一組內建純量函數的封裝值。 DLVALUE 函數會建立 DATALINK 值。 下列函數可用來從 DATALINK 值擷取屬性。
- DLCOMMENT
- DLLINKTYPE
- DLURLCOMPLETE
- DLURLPATH
- DLURLPATHONLY
- DLURLSCHEME
- DLURLSERVER
DataLink 不能是任何索引的一部分。 因此,它無法併入作為主要索引鍵、外部索引鍵或唯一限制的直欄。
- ROWID
- 若為列 ID。 表格中只容許一個 ROWID 直欄。 分割表格中不容許 ROWID。
- XML
- 若為 XML 文件。 只有形式完整的文件可以插入 XML 直欄中。 直欄的 CCSID 不能是 65535。 直欄的長度上限一律為 2 147 483 647 個位元組。
- distinct-type-name
- 指定直欄的資料類型是特殊類型 (使用者定義的資料類型)。 直欄的長度、精準度及小數位數分別為不同類型之來源類型的長度、精準度及小數位數。 如果指定特殊類型名稱時沒有指定綱目名稱,則會在 SQL 路徑上搜尋綱目來解析特殊類型名稱。
- ALLOCATE (整數)
- 針對 VARCHAR、VARGRAPHIC、VARBINARY、XML 及 LOB 類型指定要保留給每一列中直欄的空間。 長度小於或等於配置值的直欄值儲存在列的固定長度部分。 長度大於配置值的直欄值會儲存在橫列的可變長度部分,且需要擷取其他輸入/輸出作業。 配置的值範圍可以從 1 到字串的長度上限,受列緩衝區大小上限的限制。 如需列緩衝區大小上限的相關資訊,請參閱 列大小上限。 如果指定 FOR MIXED DATA 或混合資料 CCSID ,則範圍是 4 到字串長度上限。 如果省略配置長度規格,則會假設配置長度為 0。 對於 VARGRAPHIC ,整數是 DBCS 或 Unicode 圖形字元的數目。 如果指定常數給預設值,且 ALLOCATE 長度小於預設值的長度,則會假設 ALLOCATE 長度是預設值的長度。
- 針對位元資料
- 指定直欄的值不與編碼字集相關聯,且永不轉換。 FOR BIT DATA 僅對 CHARACTER 或 VARCHAR 直欄有效。 FOR BIT DATA 直欄的 CCSID 是 65535。 CLOB 直欄不容許 FOR BIT DATA。
- 針對 SBCS 資料
- 指定直欄的值包含 SBCS (單位元組字集) 資料。 如果在建立表格時,現行伺服器上的預設 CCSID 無法使用 DBCS ,或直欄長度小於 4 ,則 FOR SBCS DATA 是 CHAR、VARCHAR 及 CLOB 直欄的預設值。 FOR SBCS DATA 僅對 CHARACTER、VARCHAR 或 CLOB 直欄有效。 FOR SBCS DATA 的 CCSID 是由建立表格時現行伺服器上的預設 CCSID 所決定。
- 針對混合資料
- 指定直欄的值同時包含 SBCS 資料和 DBCS 資料。 如果建立表格時現行伺服器上的預設 CCSID 是 DBCS-capable 且直欄長度大於 3 ,則 FOR MIXED DATA 是 CHAR、VARCHAR 及 CLOB 直欄的預設值。 每個 FOR MIXED DATA 直欄都是 DBCS-open 應用程式伺服器欄位。 FOR MIXED DATA 僅對 CHARACTER、VARCHAR 或 CLOB 直欄有效。 FOR MIXED DATA 的 CCSID 是由建立表格時,現行伺服器上的預設 CCSID 所決定。
- CCSID 整數
- 指定直欄的值包含 CCSID 整數資料。 如果整數是 SBCS CCSID ,則直欄是 SBCS 資料。 如果整數是混合資料 CCSID ,則直欄是混合資料,且直欄長度必須大於 3。 對於字元直欄, CCSID 必須是 SBCS CCSID 或混合資料 CCSID。 對於圖形直欄, CCSID 必須是 DBCS、 UTF-16或 UCS-2 CCSID。 如果未指定圖形直欄的 CCSID ,則在建立表格時,會由現行伺服器上的預設 CCSID 來決定 CCSID。 對於 XML 直欄, CCSID 不能是 65535。 如果未指定 XML 直欄的 CCSID ,則會根據 SQL_XML_DATA_CCSID QAQQINI 選項設定,在執行 CREATE TABLE 時建立 CCSID。 預設 CCSID 是 1208。 如需此選項的說明,請參閱 XML 值 。 如需有效 CCSID 的清單,請參閱 CCSID 值。
CCSID 1208 (UTF-8) 或 1200 (UTF-16) 資料可以包含 結合字元。 組合字元支援可以讓結果字元含有多個字元。 在第一個字元之後,最多 300 個不同的非間距重音字元 (umlauts、重音等) 可以在資料字串中遵循。 如果產生的字元是已在字集中定義的字元,則該字元具有多個表示法。 正規化 會將結合字元的字串取代為已定義字元的十六進位值。 這可確保以單一一致方式來代表相同的字元。 如果未執行正規化,則看起來相同的兩個字串將不會比較相等。
- 未正規化
- 從應用程式傳遞資料時,不應正規化。
- 正規化
- 從應用程式傳遞資料時,應該將資料正規化。
- 預設
- 指定直欄的預設值。 此子句不能在 column-definition中指定多次。 無法針對下列類型的直欄指定 DEFAULT ,因為 Db2® 會產生預設值:
- ROWID 直欄
- 身分直欄 (定義 AS IDENTITY 的直欄)
- 橫列變更時間戳記直欄
- row-begin 直欄
- row-end 直欄
- transaction-start-ID 直欄
- 產生的表示式直欄
- 已產生
- 指定資料庫管理程式產生直欄的值。 如果要將直欄視為下列其中一種直欄類型,則可以指定 GENERATED:
- 身分直欄
- 橫列變更時間戳記直欄
如果要將直欄視為下列其中一種直欄類型,則必須指定 GENERATED:
- row-begin 直欄
- row-end 直欄
- transaction-start-ID 直欄
- 產生的表示式直欄
- 一律
- 指定當插入列 或更新列,且必須產生預設值時,資料庫管理程式一律會產生直欄的值。 「一律」是建議值。
- 根據預設值
- 指定當插入列 或更新列時,資料庫管理程式將產生直欄的值,且除非指定明確值,否則必須產生預設值。
若為 ROWID 直欄,資料庫管理程式會使用指定的值,但它必須是先前由資料庫管理程式或 Db2 for i所產生的有效唯一列 ID 值。
對於身分直欄或橫列變更時間戳記直欄,資料庫管理程式會插入或更新指定的值,但不會驗證它是直欄的唯一值,除非身分直欄或橫列變更時間戳記直欄具有唯一限制或唯一索引只指定身分直欄或橫列變更時間戳記直欄。
- 身分
- 指定直欄是表格的識別直欄。 表格只能有一個身分直欄。 分散式表格中不容許身分直欄。 僅當直欄的資料類型是小數位數為零的確切數值類型 (小數位數為零的 SMALLINT、INTEGER、BIGINT、DECIMAL 或 NUMERIC ,或小數位數為零的特殊類型) 時,才可以指定 AS IDENTITY。 如果指定 DECIMAL 或 NUMERIC 資料類型,則精準度不得大於 31。
身分直欄隱含地為 NOT NULL。
- 從開始 數值常數
- 指定為身分直欄產生的第一個值。 該值可以是指派給直欄的任何正或負值,且小數點右側不存在非零數字。
如果在定義身分直欄時未明確指定值,則預設值為遞增順序的 MINVALUE 及遞減順序的 MAXVALUE。 此值不一定是序列達到序列的最大值或最小值之後循環的值。 START WITH 子句可用來啟動用於循環的範圍以外的序列。 用於循環的範圍由 MINVALUE 和 MAXVALUE 定義。
- INCREMENT BY 數值常數
- 指定身分直欄連續值之間的間隔。 該值不得超過大整數常數的值,且小數點右邊不存在任何非零數字。 值必須可指派給直欄。 預設值是 1。
如果值為零或正數,則身分直欄的值順序會遞增。 如果值是負數,則值序列會下降。
- MAXVALUE 或 MINVALUE
- 指定在達到最小值之後,遞增身分直欄循環或停止產生值的最大值,或遞減身分直欄循環至。
- MAXVALUE 數值常數
- 指定數值常數,它是針對此身分直欄所產生的最大值。 此值可以是可指派給此直欄的任何正或負值,但該值必須大於最小值。
如果在定義身分直欄時未明確指定值,則這是遞增順序的資料類型最大值; 或 START WITH 值,如果未指定 START WITH ,則為 -1 ,表示遞減順序。
- MINVALUE 數值常數
- 指定數值常數,這是為此身分直欄產生的最小值。 此值可以是可指派給此直欄的任何正或負值,但該值必須小於最大值。
如果在定義身分直欄時未明確指定值,則這是 START WITH 值; 若未指定 START WITH ,則為 1; 若為遞減順序,則為資料類型的最小值 (若為 DECIMAL ,則為精準度)。
- 快取 或 無快取
- 指定是否將部分預先配置值保留在記憶體中。 在快取中預先配置及儲存值,可增進在表格中插入列的效能。
- CACHE 整數
- 指定資料庫管理程式預先配置並保留在記憶體中的身分直欄順序值數目。 可指定的最小值為 2 ,最大值為可表示為整數的最大值。 預設值是 20。
在某些狀況下 (例如系統失效) ,所有未在已確定陳述式中使用的快取身分直欄值都會遺失,因此永遠不會使用。 為 CACHE 選項指定的值是在這些狀況中可能遺失的身分直欄值數目上限。
- 無快取
- 指定不預先配置身分直欄的值。
- CYCLE 或 NO CYCLE
- 指定此識別直欄是否應在達到順序的最大值或最小值之後繼續產生值。
- 循環
- 指定在達到最大值或最小值之後,繼續產生此直欄的值。 如果使用此選項,則在遞增序列達到序列的最大值之後,它會產生其最小值。 在遞減序列達到其序列的最小值之後,它會產生其最大值。 直欄的最大值和最小值會決定用於循環的範圍。
當 CYCLE 生效時,資料庫管理程式可以針對身分直欄產生重複值。 如果身分直欄上存在唯一限制或唯一索引,且為其產生非唯一值,則會發生錯誤。
- 無週期
- 指定一旦達到順序的最大值或最小值,就不會為身分直欄產生值。 這是預設值。
- ORDER 或 NO ORDER
- 指定是否必須依要求順序產生身分值。
- 順序
- 指定依要求順序產生值。
- 無 ORDER
- 指定不需要依要求順序產生值。 這是預設值。
- FOR EACH ROW ON UPDATE AS ROW CHANGE TIMESTAMP
- 指定直欄是時間戳記,且資料庫管理程式會產生值。 當插入一列時,資料庫管理程式會為每一列及更新任何直欄的每一列產生直欄值。 針對橫列變更時間戳記直欄所產生的值,是對應於橫列插入或更新時間的時間戳記。 如果使用單一 SQL 陳述式插入多個橫列,則每一橫列的橫列變更時間戳記直欄值可能會不同,以反映插入每一橫列的時間。 產生的值不保證是唯一的。
- 如列開始
- 指定直欄包含時間戳記資料,且值由資料庫管理程式產生。 當插入列時,資料庫管理程式會針對每一列,以及任何直欄更新所在的每一列,產生直欄的值。 產生的值是一個時間戳記,對應於與最近交易相關聯的開始時間。 如果使用單一 SQL 陳述式插入多列,則每列的交易開始時間戳記直欄值都相同。
- AS 列結束
- 指定每當插入列或更新列中的任何直欄時,資料庫管理程式都會指派直欄資料類型的值。 指派的值為 TIMESTAMP '9999-12-30-0.00.00.000000000000'。 對於系統期間時間表格,當刪除橫列時,歷程橫列中橫列結束直欄的值會反映刪除橫列的時間。 如果使用單一 SQL 陳述式刪除多列,則歷程列中的直欄值會相同。
- AS 交易開始 ID
- 指定每當將橫列插入表格或更新橫列中的任何直欄時,資料庫管理程式就會指派該值。 資料庫管理程式會指派每筆交易的唯一時間戳記值或空值。 如果直欄可為空值,且表格中有橫列開頭直欄不需要調整值,則會將空值指派給 transaction-start-ID 直欄。 否則,會在交易中執行第一個資料變更陳述式期間,使用當日時間時鐘的讀數來產生值,該交易需要將值指派給表格中的 row-begin 直欄或 transaction-start-ID 直欄,或刪除系統期間時間表格中的列。 如果在單一 SQL 交易內插入或更新多列,則 transaction-start-ID 直欄的值對於所有列都相同,且與針對另一個交易的直欄所產生的值是唯一的。
- 資料變更作業
- 指定當使用 ON DELETE ADD EXTRA ROW 定義歷程表時,資料庫管理程式會針對插入的每一列、更新任何直欄的每一列,以及從系統期間時間表格中刪除的所有列產生值。 直欄將包含下列其中一個值:
- I
- 插入作業
- U
- update 作業
- D
- Delete Operation
- 特別暫存器
- 指定當歷程表以 ON DELETE ADD EXTRA ROW 定義時,資料庫管理程式會針對所插入的每一列、任何直欄已更新的每一列,以及從系統期間時間表格中刪除的所有列,指派特別暫存區的值。 使用資料變更陳述式時的特別暫存區值。 如果使用單一 SQL 陳述式變更多個橫列,則所有橫列的直欄值都會相同。
- built-in-global-variable
- 指定資料庫管理程式針對插入的每一列、更新任何直欄的每一列,以及從系統期間時間表格中刪除的所有列,指派內建廣域變數的值 (當使用 ON DELETE ADD EXTRA ROW 定義歷程表時)。 使用資料變更陳述式時的內建廣域變數值。 如果使用單一 SQL 陳述式變更多個橫列,則所有橫列的直欄值都會相同。
- NOT NULL
- 防止直欄包含空值。 省略 NOT NULL 意味著直欄可以是空值。 若為橫列變更時間戳記直欄、 row-begin 直欄及 row-end 直欄,則需要 NOT NULL。
- 未隱藏
- 指出直欄包含在 SQL 陳述式中表格的隱含參照中。 這是預設值。
- 隱含地隱藏
- 指出除非以名稱明確地參照直欄,否則在 SQL 陳述式中看不到該直欄。 例如,SELECT * 不會在結果中包括任何隱藏的直欄。 表格必須至少包含一個未隱含地隱藏的直欄。
- 期間定義
- 期間
- 定義表格的期間。
- SYSTEM_TIME (begin-column-name, end-column-name)
- 定義名稱為 SYSTEM_TIME 的系統期間。 表格中不得有名稱為 SYSTEM_TIME 的直欄。 表格只能有一個 SYSTEM_TIME 期間。
- begin-column-name
- 識別記錄橫列有效時段開始的直欄。 名稱必須識別存在於表格中的直欄。 begin-column-name 不得與 end-column-name相同。 begin-column-name 必須定義為 AS ROW BEGIN。
- end-column-name
- 識別記錄橫列有效時段結束的直欄。 在與系統期間時間表格相關聯的歷程表中,系統期間時間表格中對應於 end-column-name 的歷程表直欄設為反映橫列的刪除。 名稱必須識別存在於表格中的直欄。 end-column-name 必須定義為 AS ROW END。
- 直欄限制
- CONSTRAINT constraint-name
- 命名限制。 constraint-name 不得識別先前在 CREATE TABLE 陳述式中指定的限制,且不得識別現行伺服器上已存在的限制。
如果未指定子句,資料庫管理程式會產生唯一限制名稱。
- 主索引鍵
- 提供速記方法來定義由單一直欄組成的主要索引鍵。 因此,如果在直欄 C 的定義中指定 PRIMARY KEY ,則效果與將 PRIMARY KEY (C) 子句指定為個別子句相同。
此子句不能在多個直欄定義中指定,而且如果在直欄定義中指定 UNIQUE 子句,則完全不能指定。 直欄不能是 LOB、DATALINK 或 XML 直欄。 如果指定排序順序,則直欄不得包含欄位程序。
新增主要索引鍵時,會隱含地新增 CHECK 限制,以施行組成主要索引鍵的直欄中不容許空值的規則。
- UNIQUE
- 提供速記方法來定義由單一直欄組成的唯一限制。 因此,如果在直欄 C 的定義中指定 UNIQUE ,則效果與將 UNIQUE (C) 子句指定為個別子句相同。
在直欄定義中不能多次指定此子句,且如果在直欄定義中指定 PRIMARY KEY ,則不得指定此子句。 直欄不能是 LOB、DATALINK 或 XML 直欄。 如果指定排序順序,則直欄不得包含欄位程序。
- references-clause
- column-definition 的 references-clause 提供速記方法來定義由單一直欄組成的外部索引鍵。 因此,如果在直欄 C 的定義中指定了 references-clause ,效果就如同將 references-clause 指定為 FOREIGN KEY 子句的一部分,其中 C 是唯一識別的直欄一樣。 The 參照子句 is not allowed if the table 是宣告的暫存表格、分散式表格 或歷程表。 直欄不能是列變更時間戳記直欄。
- CHECK (check-condition)
- column-definition 的 CHECK (check-condition) 提供一種速記方法,可定義其 check-condition 只會參照單一直欄。 因此,如果在直欄 C 的直欄定義中指定 CHECK ,在核對限制的 check-condition 中無法參照 C 以外的直欄。 效果與檢查限制指定為個別子句相同。
如果指定 ON INSERT VIOLATION 或 ON UPDATE VIOLATION ,則必須在這些子句中參照直欄 C。
在 CHECK 限制中無法參照具有 FILE LINK CONTROL 直欄的 ROWID、XML 及 DATALINK。 如需其他限制,請參閱 check-constraint。
- FieldProc
- 指定 external-program-name 作為直欄的欄位程序結束常式。 它必須是未包含 SQL 的 ILE 程式。 而且不可以是服務程式。
- 資料鏈結選項
- 指定與 DATALINK 資料類型相關聯的選項。
- LINKTYPE URL
- 將鏈結類型定義為「全球資源定位器 (URL)」。
- 無鏈結控制
- 指定不會執行任何檢查來判斷鏈結的檔案是否存在。 只會檢查 URL 的語法。 鏈結檔案沒有資料庫管理程式控制。
- 檔案鏈結控制
- 指定應該檢查鏈結檔案是否存在。 其他選項可用來讓資料庫管理程式進一步控制鏈結的檔案。
如果指定 FILE LINK CONTROL ,則每一個檔案只能鏈結一次。 也就是說,它的 URL 只能指定在單一表格的單一 FILE LINK CONTROL 直欄中。
- 檔案鏈結選項
- 其他選項,用來定義鏈結檔案的資料庫管理程式控制層次。
- 完整性
- 指定 DATALINK 值與實際檔案之間鏈結的完整性層次。
- 全部
- 指定為 DATALINK 值的任何檔案都在資料庫管理程式的控制之下,且「無法」使用標準檔案系統程式設計介面來刪除或重新命名。
- READ 許可權
- 指定如何決定讀取 DATALINK 值中所指定檔案的許可權。
- FS
- 讀取權由檔案系統許可權決定。 無需從直欄擷取檔名即可存取此類檔案。
- DB
- 讀取權由資料庫決定。 只有在開啟作業中,從表格擷取 DATALINK 值時所傳回的有效檔案存取記號,才容許存取檔案。 如果指定 READ PERMISSION DB ,則必須指定 WRITE PERMISSION BLOCKED。
- 寫入許可權
- 指定如何決定寫入 DATALINK 值所指定檔案的許可權。
- FS
- 寫入權由檔案系統許可權決定。 無需從直欄擷取檔名即可存取此類檔案。
- 已成塊
- 寫入權已封鎖。 無法透過任何介面直接更新檔案。 必須使用替代機制來執行資訊的更新。 例如,會複製檔案,更新副本,然後更新 DATALINK 值以指向檔案的新副本。
- 回復
- 指定資料庫管理程式是否支援復原點回復此直欄中的值所參照的檔案。
- 否
- 指定不支援復原點回復。
- 開啟 UNLINK
- 指定當 DATALINK 值變更或刪除 (解除鏈結) 時對檔案所採取的動作。 請注意,當使用 WRITE PERMISSION FS 時,這不適用。
- RESTORE
- 指定當檔案解除鏈結時, DataLink File Manager 將嘗試以鏈結檔案時存在的許可權將檔案傳回給擁有者。 如果使用者不再向檔案伺服器登錄,則結果取決於包含檔案的檔案系統。 如果檔案位於 AIX® 檔案系統中,則擁有者是 "dfmun已知"。 如果檔案位於 IFS 中,則擁有者是 QDLFM。 只有在同時指定 INTEGRITY ALL 和 WRITE PERMISSION BLOCKED 時,才能指定此項。
- 刪除
- 指定在解除檔案鏈結時將刪除該檔案。 只有在同時指定 READ PERMISSION DB 和 WRITE PERMISSION BLOCKED 時,才能指定此項。
- MODE DB2OPTIONS
- 此模式定義一組預設檔案鏈結選項。 DB2OPTIONS 定義的預設值如下:
- 全部完整性
- READ PERMISSION FS
- 寫入許可權 FS
- 回復否
LIKE
- table-name 或 view-name
- 指定表格的直欄與識別表格 (table-name) 或視圖 (view-name) 的直欄具有完全相同的名稱和說明。 名稱必須識別存在於現行伺服器上的表格或視圖。
LIKE 的使用是 n 個直欄的隱含定義,其中 n 是所識別表格或視圖中的直欄數。 隱含定義包括 n 個直欄的下列屬性 (如果適用於資料類型):
- 直欄名稱 (及系統直欄名稱)
- 資料類型、長度、精準度及小數位數
- CCSID
- FIELDPROC (僅針對 table-name複製)
如果 LIKE 子句緊接在 table-name 之後指定,且未以括弧括住,則也會包括下列直欄屬性,否則不會包括它們 (預設值、身分、橫列變更時間戳記、 也可以使用 copy-options來控制隱藏屬性:
- 預設值,如果指定 table-name (未指定view-name )
- 可空值性
- 隱藏屬性
- 直欄標題及文字 (請參閱 LABEL)
直欄的任何 REFFLD 資訊都會複製到新的直欄定義。
如果 table-name 包含列變更時間戳記直欄、row-begin 直欄、row-end 直欄、transaction-start-ID 直欄或產生的表示式直欄,則新表格的對應直欄只會繼承來源直欄的資料類型。 新直欄不會被視為已產生的直欄。
隱含定義不包括所識別表格或視圖的任何其他選用屬性。 例如,新表格不會自動包括主要索引鍵、外部索引鍵、觸發程式或 a period。 只有在明確指定選用子句時,新表格才具有這些及其他選用屬性。
如果指定的表格或概略表是非 SQL 建立的實體檔或邏輯檔,則會移除任何非 SQL 屬性。 例如,日期和時間格式將變更為 ISO。
複製選項
- INCLUDING IDENTITY COLUMN ATTRIBUTES 或 INCLUDING IDENTITY COLUMN ATTRIBUTES
- 指定是否繼承身分直欄屬性。
- 包括身分直欄屬性
- 指定表格繼承 select-statement、 table-name、 或 view-name。 一般而言,如果表格、視圖或 select-statement 中對應直欄的元素是表格直欄的名稱,或直接或間接對映至具有身分屬性之基本表格直欄名稱的視圖直欄名稱,則會複製身分屬性。 如果 INCLUDING IDENTITY COLUMN ATTRIBUTES 子句與 AS select-statement 子句一起指定,則在下列情況下,新表格的直欄不會繼承身分屬性:
- select-statement 的選取清單包括身分直欄名稱的多個實例 (亦即,多次選取相同的直欄)。
- select-statement 的選取清單包括多個身分直欄 (亦即,結合傳回多個身分直欄)。
- 身分直欄包含在選取清單的表示式中。
- select 陳述式 包括集作業 (UNION 或 INTERSECT)。
如果未指定 INCLUDING IDENTITY ,則表格將沒有身分直欄。
- 排除身分直欄屬性
- 指定表格不會繼承 fullselect, table-name所產生直欄的身分屬性 (如果有的話)。 或 view-name。
- 排除直欄預設值 或 併入直欄預設值 或 USING TYPE DEFAULTS
- 指定是否繼承直欄預設值。
- 排除直欄預設值
- 指定直欄預設值不是繼承自來源表格的定義。 新表格的直欄預設值為空值或沒有預設值。 如果直欄可以是空值,則預設值為空值。 如果直欄不能是空值,則沒有預設值,如果未針對新表格的 INSERT 上的直欄提供值,則會發生錯誤。
- 併入直欄預設值
- 指定表格繼承 select-statement、 table-name、 或 view-name。 一般而言,如果表格、視圖或 select-statement 中對應直欄的元素是表格直欄的名稱,或直接或間接對映至具有預設值之基本表格直欄名稱的視圖直欄名稱,則會複製預設值。 預設值是未在 INSERT 上指定值時指派給直欄的值。
如果您指定 USING TYPE DEFAULTS ,請不要指定 INCLUDING COLUMN DEFAULTS。
如果未指定 INCLUDING COLUMN DEFAULTS ,則不會繼承預設值。
- USING TYPE DEFAULTS
- 指定表格的預設值取決於 select-statement、 table-name、 或 view-name。 如果直欄可為空值,則預設值為空值。 否則,預設值如下:
資料類型 預設值 數字 0 固定長度字元或圖形字串 空白 固定長度二進位字串 十六進位零 可變長度字串 (varying-length string) 字串長度為 0 日期 INSERT 時的現行日期 時間 INSERT 時的現行時間 時間戳記 INSERT 時的現行時間戳記
布林
布林值 FALSE
資料鏈結 對應於 DLVALUE ('' , 'URL' , '') 的值 XML 沒有預設值 distinct-type 特殊類型之對應來源類型的預設值。 如果指定 INCLUDING COLUMN DEFAULTS ,則不要指定 USING TYPE DEFAULTS。
- 包括隱含地隱藏直欄屬性 或 排除隱含地隱藏直欄屬性
- 指定是否繼承隱含地隱藏的直欄。
- 併入隱含地隱藏的直欄屬性
- 指定表格繼承 select-statement、 table-name、 或 view-name ,則會使用新表格中隱含地隱藏的屬性來定義那些直欄。
如果未指定 INCLUDING IMPLICITLY HIDDEN COLUMN ATTRIBUTES ,則表格將沒有任何隱含地隱藏的直欄。
- 排除隱含地隱藏的直欄屬性
- 指定表格不會從 fullselect、 table-name、 或 view-name。
- 包括橫列變更時間戳記直欄屬性 或 排除橫列變更時間戳記直欄屬性
- 指定是否繼承列變更時間戳記屬性。
- 包括橫列變更時間戳記直欄屬性
- 指定表格繼承 select-statement table-name產生的直欄的橫列變更時間戳記屬性 (如果有的話)。 或 view-name。 一般而言,如果表格、視圖或 select-statement 中對應直欄的元素是表格直欄名稱,或直接或間接對映至具有橫列變更時間戳記屬性之基本表格直欄名稱的視圖直欄名稱,則會複製橫列變更時間戳記屬性。 如果 INCLUDING ROW CHANGE TIMESTAMP COLUMN ATTRIBUTES 子句與 AS select-statement 子句一起指定,則在下列情況下,新表格的直欄不會繼承橫列變更時間戳記:
- select-statement 的選取清單包括橫列變更時間戳記直欄名稱的多個實例 (亦即,多次選取相同的直欄)。
- select 陳述式 的選取清單包括多個橫列變更時間戳記直欄 (亦即,結合傳回多個橫列變更時間戳記直欄)。
- 列變更時間戳記直欄包含在選取清單的表示式中。
- select 陳述式 包括集作業 (UNION 或 INTERSECT)。
如果未指定 INCLUDING ROW CHANGE TIMESTAMP COLUMN ATTRIBUTES ,則表格將沒有橫列變更時間戳記直欄。
- 排除橫列變更時間戳記直欄屬性
- 指定表格不會繼承 fullselect table-name所產生直欄的橫列變更時間戳記屬性 (如果有的話)。 或 view-name。
結果表格
- 直欄名稱
- 命名表格中的直欄。 如果指定直欄名稱清單,則它必須包含與 select-statement的結果表格中的直欄數目一樣多的名稱。 每一個 column-name 都必須是唯一且不完整的。 如果未指定直欄名稱清單,則表格的直欄會繼承 select-statement之結果表格的直欄名稱。
如果 select-statement 的結果表格具有重複的直欄名稱或未命名的直欄,則必須指定直欄名稱清單。 未命名直欄是衍生自常數、函數、表示式或集作業 (UNION 或 INTERSECT) 的直欄,未使用選取清單的 AS 子句來命名。
- FOR COLUMN system-column-name
- 提供直欄的 IBM i 名稱。 請勿對表格的多個直欄或表格的直欄名稱使用相同的名稱。
如果未指定 system-column-name ,且 column-name 不是有效的 system-column-name,則會產生系統直欄名稱。 如需如何產生系統直欄名稱的相關資訊,請參閱 產生表格名稱的規則。
- select 陳述式
- 指定表格的直欄與要執行 select 陳述式 時將出現在 select 陳述式 衍生結果表格中的直欄具有相同的名稱及說明。 使用 AS (select-statement) 是表格的 n 直欄的隱含定義。 其中 n 是 select-statement所產生的直欄數。
隱含定義包括 n 個直欄的下列屬性 (如果適用於資料類型):
- 直欄名稱 (及系統直欄名稱)
- 資料類型、長度、精準度及小數位數
- CCSID
- 可空值性
- FieldProc
- 直欄標題及文字 (請參閱 LABEL)
不包括下列屬性 (使用 copy-options可以包括部分屬性 ):
- 預設值
- 隱藏屬性
- 身分屬性
- 列變更時間戳記屬性
- Row-begin、row-end 及 transaction-start-ID
- 產生的表示式
隱含定義不包括所識別表格或視圖的任何其他選用屬性。 例如,新表格不會自動包括表格中的主要索引鍵或外部索引鍵。 只有在明確指定選用子句時,新表格才具有這些及其他選用屬性。
select-clause 中的任何直欄若直接參照另一個表格或視圖中的直欄,或只使用 CAST 來變更結果屬性,則會為檔案物件中的定義產生 REFFLD 資訊。
select 陳述式 不得參照變數 ,但可以參照廣域變數。
select 陳述式 不得包含 PREVIOUS VALUE 或 NEXT VALUE 表示式。 不能指定 UPDATE、SKIP LOCKED DATA 及 USE AND KEEP EXCLUSIVE LOCKS 子句。
如果 select 陳述式 包含 isolation-clause ,則 isolation-clause 中指定的隔離層次會套用至整個 SQL 陳述式。
- WITH 資料
- 指定執行 select-statement 。 建立表格之後, select-statement 的結果表格列會自動插入表格中。
- WITH 無資料
- 指定 select-statement 僅用來定義新表格的屬性。 不會使用 select-statement的結果移入表格。
唯一限制
- CONSTRAINT constraint-name
- 命名限制。 constraint-name 不得識別先前在 CREATE TABLE 陳述式中指定的限制,且不得識別現行伺服器上已存在的限制。
如果未指定子句,資料庫管理程式會產生唯一限制名稱。
- PRIMARY KEY (column-name, ...)
- 定義由已識別直欄組成的主要索引鍵。 一個表格中只能有一個主要鍵值。 因此,如果已使用速記格式來定義表格的主要索引鍵,則無法多次指定此子句,而且根本無法指定此子句。 識別的直欄不能與 CREATE TABLE 陳述式中先前指定的另一個 UNIQUE 限制中指定的直欄相同。 例如,如果已指定 UNIQUE (B , A) ,則不容許 PRIMARY KEY (A , B)。
每一個 column-name 都必須是識別表格直欄的不完整名稱。 不能多次識別相同的直欄。 直欄不能是 LOB、DATALINK 或 XML 直欄。 如果指定排序順序,則直欄不得包含欄位程序。 識別的直欄數不得超過 120 ,且其位元組計數總和不得超過 32766-n,其中 n 是指定容許空值的直欄數。 如需位元組計數的相關資訊,請參閱 表 1。
唯一索引建立為系統實體檔案的一部分,而非個別系統邏輯檔案。 新增主要索引鍵時,會隱含地新增 CHECK 限制,以強制規則在構成主要索引鍵的任何直欄中不容許空值。
- UNIQUE (直欄名稱, ...)
- 定義由已識別直欄組成的唯一限制。 UNIQUE 子句可以指定多次。 識別的直欄不能與先前在 CREATE TABLE 陳述式中指定的另一個 UNIQUE 限制或 PRIMARY KEY 中指定的直欄相同。 為了判斷唯一限制是否與另一個限制規格相同,會比較直欄清單。 例如,UNIQUE (A,B) 與 UNIQUE (B,A) 相同。
每一個直欄名稱必須是識別表格直欄的不完整名稱。 不能多次識別相同的直欄。 直欄不能是 LOB、DATALINK 或 XML 直欄。 如果指定排序順序,則直欄不得包含欄位程序。 識別的直欄數不得超過 120 ,且其位元組計數的總和不得超過 32766-n,其中 n 是指定容許空值的直欄數。 如需位元組計數的相關資訊,請參閱 表 1。
在執行 CREATE TABLE 陳述式期間,會建立所識別直欄的唯一索引。 唯一索引建立為系統實體檔案的一部分,而不是建立為個別系統邏輯檔案。
參照限制
- CONSTRAINT constraint-name
- 命名限制。 constraint-name 不得識別先前在 CREATE TABLE 陳述式中指定的限制,且不得識別現行伺服器上已存在的限制。
如果未指定子句,資料庫管理程式會產生唯一限制名稱。
- 外部索引鍵 (foreign key)
- FOREIGN KEY 子句的每一個規格都定義了參照限制。 如果表格是宣告的暫存表格或分散式表格,則不接受 FOREIGN KEY。
- (直欄名稱, ...)
- 參照限制的外部索引鍵由識別的直欄組成。 每一個 column-name 都必須是識別表格直欄的不完整名稱。 不能多次識別相同的直欄。 直欄不能是 LOB、DATALINK 或 XML 直欄,且不能是橫列變更時間戳記直欄。 如果指定排序順序,則直欄不得包含欄位程序。 識別的直欄數不得超過 120 ,且其長度總和不得超過 32766-n,其中 n 是指定容許空值的直欄數。
- REFERENCES parent-table-name
- 在 REFERENCES 子句中指定的 parent-table-name 必須識別正在建立的表格或已存在於應用程式伺服器上的基本表格,但它 不得識別型錄表格、宣告的暫存表格、分散式表格 或歷程表。 如果母項是分割表格,則必須未分割施行母項唯一限制的唯一索引。
如果參照限制的外部索引鍵、母索引鍵及母表格與先前指定的參照限制的外部索引鍵、母索引鍵及母表格相同,則參照限制是 重複 。 容許重複的參照限制,但不建議使用。
讓 T2 表示已識別的母表格,並讓 T1 表示正在建立的表格。
指定的外部索引鍵必須與 T2的母索引鍵具有相同的直欄數。 外部索引鍵第 n欄的說明,以及該母索引鍵第 n欄的說明,必須具有相同的資料類型、長度、CCSID 及 FIELDPROCs。
- (直欄名稱,...)
- 參照限制的母索引鍵由識別的直欄組成。 每一個 column-name 都必須是一個不完整的名稱,用來識別 T2的直欄。 不能多次識別相同的直欄。 直欄不能是 LOB、DATALINK 或 XML 直欄,也不能是橫列變更時間戳記直欄。 如果指定排序順序,則直欄不得包含欄位程序。 識別的直欄數不得超過 120 ,且其位元組計數總和不得超過 32766-n,其中 n 是指定容許空值的直欄數。 如需位元組計數的相關資訊,請參閱 表 1。
直欄名稱清單必須與 T2 的主要索引鍵或 T2上存在的 UNIQUE 限制中的直欄名稱清單相同。 名稱不需要以主要索引鍵中的相同順序來指定; 不過,必須以 外部索引鍵 子句中直欄清單的對應順序來指定它們。 如果未指定直欄名稱清單,則 T2 必須具有主要索引鍵。 省略直欄名稱清單是該主要索引鍵之直欄的隱含規格。
FOREIGN KEY 子句指定的參照限制定義了一個關係,其中 T2 是母項, T1 是相依項。
- 刪除時
- 當刪除上層表格的橫列時,請指定將在相依表上發生的動作。 有五個可能的動作:
- 無動作(預設值)
- 限制
- 階式排列
- 設定空值
- 設為預設值
除非外部索引鍵的部分直欄容許空值,否則不得指定 SET NULL。
如果 T1 包含具有 FILE LINK CONTROL 的 DataLink 直欄,則不得指定 CASCADE。
當 T2 的列是 DELETE 或延伸刪除作業的物件,且該列在 T1中具有相依項時,就會套用刪除規則。 讓 p 表示 T2的這一列。
- 如果指定 RESTRICT 或 NO ACTION ,則會發生錯誤,且不會刪除任何列。
- 如果指定 CASCADE ,則會將刪除作業延伸到 T1中 p 的相依項。
- 如果指定 SET NULL ,則 T1 中每一個相依 p 的外部索引鍵的每一個可為空值直欄都會設為空值。 如果相依表格是分割表格,且外部索引鍵直欄也是分割索引鍵,則不容許 SET NULL。
- 如果指定 SET DEFAULT ,則 T1 中每一個相依 p 的外部索引鍵的每一個直欄都會設為其預設值。 如果相依表格是分割表格,且外部索引鍵直欄也是分割鍵,則 除非預設值將橫列保留在相同的分割區中,否則不容許 SET DEFAULT。
- 更新時
- 當更新上層表格的橫列時,請指定將在相依表上發生的動作。
當 T2 列是 UPDATE 或延伸更新作業的物件,且該列在 T1中具有相依項時,會套用更新規則。 讓 p 表示 T2的這一列。
- 如果指定 RESTRICT 或 NO ACTION ,則會發生錯誤,且不會更新任何列。
核對限制
- CONSTRAINT constraint-name
- 指定核對限制。 constraint-name 不得識別先前在 CREATE TABLE 陳述式中指定的限制,且不得識別現行伺服器上已存在的限制。
如果未指定子句,資料庫管理程式會產生唯一限制名稱。
- CHECK (check-condition)
- 定義核對限制。 對於表格的每一列, check-condition 必須隨時為 true 或不明。
check-condition 是 search-condition ,除了:
- 它只能參照表格的直欄
- check-condition 中任何表示式的結果不能是具有 FILE LINK CONTROL 資料類型的 ROWID、XML 或 DATALINK。
在表示式中無法使用布林直欄。 此外,布林直欄只能用於與另一個布林直欄或布林文字值的基本比較。
- 它不得包含下列任何一項:
- 子查詢
- 聚集函數
TRY_CAST 規格
- 變數
- 廣域變數
- 參數記號
- 序列參照
- 包含 LOB (例如連結) 的複式表示式
- OLAP 規格
- 列變更表示式
布林
IS JSON、JSON_EXISTS 或 REGEXP_LIKE 述詞- 特別暫存器
- 非函數的使用者定義函數,這些函數是在建立 強類型化 特殊類型時隱含產生的
- 下列內建純量函數:
ATAN2 DLURLSERVER JSON_ARRAY 取代
BOOLEAN
DLVALUE JSON_OBJECT ROUND_TIMESTAMP BSON_TO_JSON ENCRYPT_AES JSON_QUERY RPAD 基數
ENCRYPT_AES256
JSON_TO_BSON 評分 包含 ENCRYPT_RC2 JSON_VALUE Soundex curdate ENCRYPT_TDES LOCATE_IN_STRING TABLE_NAME curtime GENERATE_UNIQUE LPAD TABLE_SCHEMA DATAPARTITIONNAME GETHINT MAX_CARDINALITY TIMESTAMP_FORMAT DATAPARTITIONNUM HASH MONTHNAME TIMESTAMPDIFF DAYNAME HASH_MD5 MONTHS_BETWEEN TIMESTAMPDIFF_BIG DBPARTITIONNAME HASH_SHA1 NEXT_DAY TRUNC_TIMESTAMP DECRYPT_BINARY HASH_SHA256 現在 VARCHAR_FORMAT DECRYPT_BIT HASH_SHA512 OVERLAY VERIFY_GROUP_FOR_USER DECRYPT_CHAR 本端 IDENTITY_VAL_LOCAL RAISE_ERROR WEEK_ISO DECRYPT_DB 插入 RAND 換行 差異 解譯 REGEXP_COUNT XMLPARSE DLURLCOMPLETE 1
ISFALSE
REGEXP_INSTR XMLVALIDATE DLURLPATH
ISNOTFALSE
REGEXP_REPLACE XSLXX_ENCODE_CASE_ONE transform DLURLPATHONLY
ISNOTTRUE
REGEXP_SUBSTR DLURLSCHEME
ISTRUE
REPEAT 1 對於 DataLinks ,其屬性為 FILE LINK CONTROL 及 READ PERMISSION DB。
- ON INSERT VIOLATION
- 指定在所插入列的 check-condition 為 false 時要採取的動作。 如果未指定此子句,則在插入的 check-condition 為 false 時將會發生錯誤。
- SET column-name = DEFAULT
- column-name 的預設值會插入表格中,而不是插入作業所提供的值。
必須在 check-condition中參照 column-name 。
- On 更新違規
- 針對要更新的列,指定 check-condition 為 false 時要採取的動作。 如果未指定此子句,則在 check-condition 對於更新為 false 時將會發生錯誤。
- 保留 直欄名稱
- column-name 的現行值會保留在表格中,而不是由更新作業提供的值取代。
必須在 check-condition中參照 column-name 。

捨棄時施加限制
指出無法捨棄表格。
無法針對 QTEMP 中的表格指定此子句。

未起始記載
在此陳述式建立表格之後,不會記載 (登載) 相同工作單元中 INSERT、DELETE 或 UPDATE 陳述式對表格所做的任何變更。
完成現行工作單元時,會取消啟動 NOT LOGGED INITIALLY 屬性,並記載在後續工作單元中表格上執行的所有作業 (已登載)。
如果需要使用替代來源 (另一個表格或檔案) 的資料來建立大型結果集,且不需要回復表格,則 NOT LOGGED INITIALLY 選項非常有用。 使用此選項將儲存記載 (日誌登載) 資料的額外負擔。
如果表格具有具有 FILE LINK CONTROL 的 DATALINK 直欄,則會忽略 ACTIVATE NOT LOGGED INITIALLY。
VOLATILE 或 NOT VOLATILE
向最佳化工具指出表格 table-name 的基數是否可在執行時期大幅改變。 波動性會套用至表格中的列數,而非表格本身。 預設值為 NOT VOLATILE。
- 暫時
- 指定 table-name 的基數在執行時期 (從空到大) 可能大幅改變。 若要存取表格,最佳化工具通常會使用索引 (如果可能的話)。
- NOT VOLATILE
- 指定 table-name 的基數不是暫時的。 參照此表格的存取計劃將基於建置存取計劃時表格的基數。 NOT VOLATILE 是預設值。
RCDFMT
指出表格的記錄格式名稱。
- RCDFMT format-name
- 指定表格的 IBM i 記錄格式名稱的不完整名稱。 format-name 是系統 ID。
如果未指定記錄格式名稱,則 format-name 與表格的 system-object-name 相同。
媒體喜好設定
指定表格或分割區的偏好儲存媒體。
- 任何 UNIT
- 沒有偏好的儲存媒體。 將從任何可用的儲存媒體配置表格或分割區的儲存體。 如果在表格上指定 UNIT ANY ,則會使用在分割區上指定的任何 媒體喜好設定 。
- UNIT SSD
- 偏好固態磁碟儲存媒體。 表格或分割區的儲存體可以從固態磁碟儲存媒體配置 (如果有的話)。 如果在表格上指定 UNIT SSD ,則會忽略分割區上指定的任何 媒體喜好設定 。
記憶體喜好設定
- 保留在記憶體中
- 指定當表格的資料用於查詢時,是否應該將這些資料置於主儲存區。
- 否
- 資料將不會帶入主儲存區。
- 是
- 資料將被帶入主儲存區。
ON REPLACE
指定在取代存在於現行伺服器上的表格時要採取的動作。 如果未取代現有表格,則會忽略此選項。
- 保留所有列
- 將保留指定表格的現行列。 如果 WITH DATA 與 result-table-as一起指定,則不接受 PRESERVE ALL ROWS。
會保留分割表格中所有分割區的所有列。 如果新的表格定義是範圍分割表格,則定義的範圍必須能夠包含現有分割區中的所有列。
如果捨棄直欄,則不會保留直欄值。 如果直欄已變更,則可能會修改直欄值。
如果表格不是分割表格或雜湊分割表格,則 PRESERVE ALL ROWS 和 PRESERVE ROWS 是相等的。
- 保留列
- 將保留指定表格的現行列。 如果 WITH DATA 與 result-table-as一起指定,則不容許 PRESERVE ROWS。
如果捨棄範圍分割表格的分割區,則會刪除該分割區的列,而不處理任何刪除觸發程式。 若要判斷是否捨棄範圍分割表格的分割區,則會將新表格定義中分割區的範圍定義及分割區名稱 (如果有的話) 與現有表格定義中的分割區進行比較。 如果指定的範圍或分割區名稱相符,則會保留它。 如果分割區沒有 partition-name,則其 boundary-spec 必須符合現有的分割區。
如果捨棄雜湊分割區表格的分割區,則會保留該分割區的列。
如果捨棄直欄,則不會保留直欄值。 如果直欄已變更,則可能會修改直欄值。
- 刪除列
- 將刪除指定表格的現行列。 不會發動任何現有的 DELETE 觸發程式。
配送子句
- IN NODEGROUP nodegroup-name
- 指定將在其中配送表格中資料的節點群組。 此名稱必須識別存在於現行伺服器上的節點群組。 如果指定此子句,則會將表格建立為節點群組中所有系統之間的分散式表格。
分散式表格中不容許 LOB、DATALINK、XML 或 IDENTITY 直欄。
必須安裝 Db2 Multisystem 產品才能建立分散式表格。 如需分散式表格的相關資訊,請參閱 Db2 Multisystem 主題集合。
- DISTRIBUTE BY HASH (column-name, ...)
- 指定分割鍵。 分割鍵用來決定節點群組中將放置一列的節點。 每一個 column-name 都必須是識別表格直欄的不完整名稱。 不能多次識別相同的直欄。 如果未指定 DISTRIBUTE BY 子句,則會使用主要索引鍵的第一個直欄作為分割鍵。 如果沒有主要索引鍵,則會使用非 浮點、日期、時間或時間戳記的表格第一個直欄作為分割鍵。
構成分割鍵的直欄必須是構成表格上任何唯一限制的直欄子集。 具有欄位程序的浮點、 日期、時間、時間戳記、 LOB、XML、 DataLink、ROWID 及直欄無法在分割鍵中使用。
分割子句
- 依範圍分割
- 指定在表格中插入列時,使用直欄值的範圍來決定目標資料分割區。 分割區數目不得超過 256。
- 分割區表示式
- 指定定義範圍的索引鍵資料,以決定資料的目標資料分割區。
- 直欄名稱
- 識別資料分割鍵中的直欄。 分割鍵用來決定表格中的哪一個分割區將放置一列。 column-name 必須是識別表格直欄的不完整名稱。 不能多次識別相同的直欄。
LOB、
布林
、XML、 DataLink、ROWID、列變更時間戳記直欄、 身分直欄 及任何具有欄位程序的直欄都無法在分割鍵中使用。識別的直欄數目不得超過 120。 直欄的長度屬性總和不得大於 2000。
- 後置空字元
- 指出空值比較高。
- 前置空字元
- 指出空值比較低。
- 分割區元素
- 指定資料分割鍵的範圍。
- PARTITION partition-name
- 為資料分割區命名。 名稱不得與表格的任何其他資料分割區相同。
如果未指定子句,則資料庫管理程式會產生唯一分割區名稱。
- 界限規格
- 指定範圍分割區的界限。 如果指定多個分割鍵, 則必須以遞增順序指定界限。 範圍不得重疊。
- starting-clause
- 指定資料分割區範圍的低端。 指定的起始值數目必須與分割鍵中的直欄數相同。 如果未針對第一個 boundary-spec指定 starting-clause ,則分割鍵的每一個直欄的預設值都是 MINVALUE IN併入式。 如果未針對後續 boundary-spec指定 starting-clause ,則前一個相鄰 boundary-spec 必須包含 ending-clause。 預設值與 ending-clause 相同,但 INCLUSIVE 或 EXCLUSIVE 屬性已反轉。
- 啟動
- 引進 starting-clause。
- 常數
- 指定必須符合分割區索引鍵對應直欄的資料類型之常數規則的常數。 如果分割區索引鍵的對應直欄是特殊類型,則常數必須符合特殊類型的來源類型規則。 該值不得在表格的任何其他 boundary-spec 範圍內。
- MINVALUE
- 指定低於其對應之 column-name 資料類型的最低可能值的值。 如果指定 MINVALUE ,則 starting-clause 中的所有後續值也必須是 MINVALUE。
- MAXVALUE
- 指定大於其對應之 column-name 資料類型的最大可能值的值。 如果指定 MAXVALUE ,則 ending-clause 中的所有後續值也必須是 MAXVALUE。
- INCLUSIVE
- 指出指定的範圍值包括在資料分割區中。
- EXCLUSIVE
- 指出從資料分割區中排除指定的範圍值。 當指定 MINVALUE 或 MAXVALUE 時,會忽略此規格。
- ending-clause
- 指定資料分割區範圍的高階。 指定的結束值數目必須與資料分割鍵中的直欄數相同。 必須為最後一個 boundary-spec指定 ending-clause 。 如果未針對前一個 boundary-spec指定 ending-clause ,則下一個相鄰的 boundary-spec 必須包含 starting-clause。 預設值與該 starting-clause 相同,但 INCLUSIVE 或 EXCLUSIVE 屬性相反。
- 結束於
- 引進 ending-clause。
- 常數
- 指定必須符合分割區索引鍵對應直欄的資料類型之常數規則的常數。 如果分割區索引鍵的對應直欄是特殊類型,則常數必須符合特殊類型的來源類型規則。 該值不得在表格的任何其他 boundary-spec 範圍內。
- MINVALUE
- 指定低於其對應之 column-name 資料類型的最低可能值的值。 如果指定 MINVALUE ,則 starting-clause 中的所有後續值也必須是 MINVALUE。
- MAXVALUE
- 指定大於其對應之 column-name 資料類型的最大可能值的值。 如果指定 MAXVALUE ,則 ending-clause 中的所有後續值也必須是 MAXVALUE。
- INCLUSIVE
- 指出指定的範圍值包括在資料分割區中。
- EXCLUSIVE
- 指出從資料分割區中排除指定的範圍值。 當指定 MINVALUE 或 MAXVALUE 時,會忽略此規格。
- EVERY 整數-常數
- 指定將新增多個資料分割區,其中 整數常數 指定每一個資料分割區範圍的寬度。 如果指定 EVERY ,則只能針對分割區索引鍵指定單一 SMALLINT、INTEGER、BIGINT、DECIMAL、NUMERIC、DATE 或 TIMESTAMP 直欄。
第一個資料分割區的起始值是指定的 STARTING 值。 每一個後續分割區的起始值都是前一個分割區的起始值 + 整數常數。 如果 starting-clause 指定 EXCLUSIVE ,則每個分割區的起始值都是 EXCLUSIVE。 否則,每個分割區的起始值都是IN併入式。
範圍內每個分割區的結束值為 (分割區的起始值 + 整數常數 )。 如果 ending-clause 指定 EXCLUSIVE ,則最後一個分割區的結束值是 EXCLUSIVE。 否則,最後一個分割區的結束值為IN併入式。 如果起始值為 INCLUSIVE ,則其他分割區的結束值為 EXCLUSIVE。 否則,其他分割區的結束值為IN併入式。
新增的分割區數目是透過反覆地將 integer-constant 新增至 STARTING 值來決定,直到達到 ENDING 值為止。 例如:
CREATE TABLE FOO (A INT) PARTITION BY RANGE(A) (STARTING(1) ENDING(10) EVERY(2))相等於下列 CREATE TABLE 陳述式:
CREATE TABLE FOO (A INT) PARTITION BY RANGE(A) (STARTING(1) ENDING(2), STARTING(3) ENDING(4), STARTING(5) ENDING(6), STARTING(7) ENDING(8), STARTING(9) ENDING(10))如果是日期和時間戳記,則 EVERY 值必須是含標籤的持續時間。 例如:
CREATE TABLE FOO (A DATE) PARTITION BY RANGE(A) (STARTING('2001-01-01') ENDING('2010-01-01') EVERY(3 MONTHS))
- 依雜湊分割
- 指定在表格中插入列時,使用雜湊函數來決定目標資料分割區。
- (直欄名稱, ...)
- 指定分割鍵。 分割鍵用來決定表格中的哪一個分割區將放置一列。 每一個 column-name 都必須是識別表格直欄的不完整名稱。 不能多次識別相同的直欄。
浮點、LOB、XML、日期、時間、時間戳記、
布林
、 DataLink、ROWID、 身分直欄 及具有欄位程序的直欄無法在分割鍵中使用。 - INTO 整數 分割區
- 指定分割區數目。 分割區數目不得超過 256。
具體化查詢定義
- 直欄名稱
- 命名表格中的直欄。 如果指定直欄名稱清單,則它必須包含與 select-statement的結果表格中的直欄數目一樣多的名稱。 每一個 column-name 都必須是唯一且不完整的。 如果未指定直欄名稱清單,則表格的直欄會繼承 select-statement之結果表格的直欄名稱。
如果 select-statement 的結果表格具有重複的直欄名稱或未命名的直欄,則必須指定直欄名稱清單。 未命名直欄是衍生自常數、函數、表示式或集作業 (UNION 或 INTERSECT) 的直欄,未使用選取清單的 AS 子句來命名。
- FOR COLUMN system-column-name
- 提供直欄的 IBM i 名稱。 請勿對表格的多個直欄或表格的直欄名稱使用相同的名稱。
如果未指定 system-column-name ,且 column-name 不是有效的 system-column-name,則會產生系統直欄名稱。 如需如何產生系統直欄名稱的相關資訊,請參閱 產生表格名稱的規則。
- select 陳述式
- 指定表格的直欄與要執行 select 陳述式 時將出現在 select 陳述式 衍生結果表格中的直欄具有相同的名稱及說明。 使用 AS (select-statement) 是表格的 n 直欄的隱含定義。 其中 n 是 select-statement所產生的直欄數。
隱含定義包括 n 個直欄的下列屬性 (如果適用於資料類型):
- 直欄名稱 (及系統直欄名稱)
- 資料類型、長度、精準度及小數位數
- CCSID
- 可空值性
- FieldProc
- 直欄標題及文字 (請參閱 LABEL)
不包括下列屬性:
- 預設值
- 隱藏屬性
- 身分屬性
- 列變更時間戳記屬性
- Row-begin、row-end 及 transaction-start-ID
- 產生的表示式
隱含定義不包括所識別表格或視圖的任何其他選用屬性。 例如,新表格不會自動包括表格中的主要索引鍵或外部索引鍵。 只有在明確指定選用子句時,新表格才具有這些及其他選用屬性。
select 陳述式 不得參照變數或廣域變數,或包括參數標記。 如果 select-statement 的 SELECT 子句中的表示式不是直欄名稱,則表示式不得參照具有欄位程序的直欄。
select 陳述式 不得包含 PREVIOUS VALUE 或 NEXT VALUE 表示式。 不能指定 UPDATE、SKIP LOCKED DATA 及 USE AND KEEP EXCLUSIVE LOCKS 子句。
- refreshable-table-options
- 指定表格是 具體化查詢表格 ,且 REFRESH TABLE 陳述式可用來在表格中移入 select-statement的結果。
其 select-statement 包含 GROUP BY 子句的具體化查詢表格正在彙總 select-statement中所參照表格的資料。 這類具體化查詢表格也稱為 摘要表格。 摘要表格是具體化查詢表格的特殊類型。
定義具體化查詢表格時,適用下列 select-statement 限制:
- select 陳述式 不能包含另一個具體化查詢表格或參照具體化查詢表格之視圖的參照。
- select 陳述式 不能在 FROM 子句中包含已宣告的暫存表格、QTEMP 中的表格、程式說明檔或非 SQL 邏輯檔案的參照。
- select 陳述式 不能包含 data-change-file-reference。
- select 陳述式 不能包含參照另一個具體化查詢表格或宣告的暫存表格之視圖的參照。 使用 ENABLE QUERY OPTIMIZATION 定義具體化查詢表格時, select-statement 無法包含對包含下列段落中其中一個限制之視圖的參照。
- select 陳述式 不能包含具有 DataLink 的表示式或基於 DataLink 的特殊類型,其中 DataLink 是 FILE LINK CONTROL。
- select 陳述式 不能包含不是 SQL 資料類型的結果直欄,例如具有精準度的二進位、DBCS-ONLY 或 DBCS-EITHER。
使用 ENABLE QUERY OPTIMIZATION 定義具體化查詢表格時,會套用下列其他 select-statement 限制:
- 不得包含任何特別暫存器。
- 不得包含任何非唯一性函數。
- 容許 ORDER BY 子句,但僅供 REFRESH 使用。 它可以改善具體化查詢表格中資料參照的地區。
- 如果次選取參照視圖,則視圖定義中的 select-statement 必須滿足前述限制。
- DATA INITIALLY DEFERRED
- 指定資料在建立時不會插入具體化查詢表格中。 使用 REFRESH TABLE 陳述式移入具體化查詢表格,或使用 INSERT 陳述式將資料插入具體化查詢表格。
- 資料最初立即
- 指定在建立具體化查詢表格時,將資料插入具體化查詢表格中。
- REFRESH DEFERRED
- 指定可以使用 REFRESH TABLE 陳述式隨時重新整理表格中的資料。 在處理 REFRESH TABLE 陳述式時或前次更新時,表格中的資料只會將查詢結果反映為 Snapshot。
- MAINTAINED BY USER
- 指定具體化查詢表格由使用者維護。 使用者可以在表格上使用 INSERT、DELETE、UPDATE 或 REFRESH TABLE 陳述式。
- 啟用查詢最佳化 或 停用查詢最佳化
- 指定此具體化查詢表格是否可用於最佳化。 預設值為 ENABLE QUERY OPTIMIZATION。
- 啟用查詢最佳化
- 指定具體化查詢表格可用於查詢最佳化。 如果指定的 select 陳述式 未滿足查詢最佳化的限制,則會傳回錯誤。
- 停用查詢最佳化
- 指定具體化查詢表格無法用於查詢最佳化。 仍然可以直接查詢表格。
如果針對 select-statement中直接或間接參照的任何表格啟動列層次或直欄層次存取控制,則會隱含地針對要建立的表格啟動列存取控制。 這會限制直接存取具體化查詢表格的內容。 明確參照表格的查詢會傳回警告,指出表格中沒有資料。 若要提供對具體化查詢表格的存取權,可以建立適當的橫列許可權,或發出具體化查詢表格上的 ALTER TABLE DEACTIVATE ROW ACCESS CONTROL ,以移除橫列層次保護 (如果適當的話)。
附註
表格屬性: 表格會建立為實體檔。 建立表格時,檔案等待時間及記錄等待時間屬性會設為在「建立實體檔案 (CRTPF)」指令的 WAITFILE 及 WAITRCD 關鍵字上指定的預設值。
會建立 SQL 表格,以便未來插入要求會收回已刪除列所使用的空間。 可以透過指令 CHGPF 並指定 REUSEDLT (*NO) 參數來變更此屬性。 如需 CHGPF 指令的相關資訊,請參閱 CL Reference。
在配送表格的所有伺服器上建立分散式表格。 如需分散式表格的相關資訊,請參閱 Db2 Multisystem。
表格日誌登載: 建立表格時,可能會自動啟動日誌登載。
- 如果表格建立在已指定 (使用 STRJRNLIB 指令) 的綱目中,則應該隱含地啟動日誌登載。
- 如果綱目未指定應該啟動日誌登載,則日誌登載會啟動至稱為 QSQJRN 的日誌登載 (如果它存在於建立表格的相同綱目中)。
表格所有權: 如果已指定 SQL 名稱:
- 如果存在與在其中建立表格的綱目同名的使用者設定檔,則表格的 擁有者 是該使用者設定檔。
- 否則,表格的 擁有者 是執行陳述式之 執行緒 的使用者設定檔或群組使用者設定檔。
如果已指定系統名稱,則表格的 擁有者 是執行陳述式之 執行緒 的使用者設定檔或群組使用者設定檔。
表格權限: 如果使用 SQL 名稱,則會以 *EXCLUDE 至 *PUBLIC 的系統權限建立表格。 如果使用系統名稱,則會以綱目的建立權限 (CRTAUT) 參數所決定的 *PUBLIC 權限來建立表格。
如果表格的擁有者是群組設定檔 (GRPPRF 關鍵字) 的成員,且已設定群組權限 (GRPAUT 關鍵字) ,則該群組設定檔也將具有表格的權限。
REPLACE 規則: 當 REPLACE 使用 PRESERVE ROWS 重建表格時,表格的新定義會與舊定義相互比較,並在邏輯上針對兩者之間的每一個差異執行對應的 ALTER 作業。 當使用 DELETE ROWS 選項時,會邏輯地捨棄並重建表格; 只要相依於表格的物件仍然有效,就容許任何修改。 如需相關資訊,請參閱 ALTER TABLE 中的 表 1 。 對於直欄、限制和分割區,會根據其名稱和屬性來執行比較。
可以透過修改直欄名稱或系統直欄名稱來變更直欄名稱及系統直欄名稱,而保留其他名稱不變。 如果兩個名稱都不符合現有直欄,則會建立新直欄。 存在另一個相依於直欄名稱的物件可能會阻止名稱變更。
| 新定義與現有定義的對照 | 等效 ALTER TABLE 動作 |
|---|---|
| 直欄 | |
| 直欄存在於兩者中,且屬性相同 | 不變更 |
| 直欄存在於兩者中,且屬性不同 | ALTER COLUMN |
| 直欄只存在於新表格定義中 | 新增 直欄 |
| 直欄只存在於現有的表格定義中 | DROP COLUMN RESTRICT |
| 限制 | |
| 限制存在於兩者中,且相同 | 不變更 |
| 限制同時存在於兩者中且不同 | DROP 限制 RESTRICT 及 ADD 限制 |
| 限制只存在於新表格定義中 | ADD constraint |
| 限制只存在於現有的表格定義中 | DROP constraint RESTRICT |
| 具體化查詢定義 | |
| Materialized-query-definition 同時存在於和中,而且是相同的 | 不變更 |
| Materialized-query-definition 同時存在於兩者中,而且是不同的 | ALTER MATERIALIZED QUERY |
| Materialized-query-definition 只存在於新的表格定義中 | 新增具體化查詢 |
| Materialized-query-definition 只存在現存的表格定義 | DROP MATERIALIZED QUERY |
| partitioning-clause | |
| partitioning-clause 同時存在於兩個中且相同 | 不變更 |
| partitioning-clause 同時存在於且不同 | ADD PARTITION、DROP PARTITION 及 ALTER PARTITION |
| partitioning-clause 僅存在於新的表格定義中 | ADD partitioning-clause |
| partitioning-clause 只存在於現有的表格定義中 | DROP PARTITIONING |
| 週期 | |
| PERIOD 同時存在於和中是相同的 | 不變更 |
| PERIOD 只存在於新的表格定義中 | ALTER ADD PERIOD |
| PERIOD 只存在於現有的表格定義中 | ALTER DROP PERIOD
如果表格 是系統期間時間表格,則無法捨棄期間 |
| 未起始記載 | |
| NOT LOGGED INITIALLY 同時存在於這兩者中 | 不變更 |
| NOT LOGGED INITIALLY 只存在於新的表格定義中 | 未起始記載 |
| NOT LOGGED INITIALLY 只存在於現存的表格定義中 | 最初記載 |
| 暫時 | |
| VOLATILE 屬性同時存在於這兩者中,且是相同的 | 不變更 |
| 暫時屬性只存在於新的表格定義中 | 暫時 |
| VOLATILE 屬性只存在於現存的表格定義中 | NOT VOLATILE |
| 媒體-喜好設定 | |
| media-preference 同時存在於和相同的 | 不變更 |
| media-preference 只存在於新的表格定義中 | ALTER media-preference |
| media-preference 只存在於現有的表格定義中 | 任何 UNIT |
| 記憶體-喜好設定 | |
| memory-preference 同時存在於和中 | 不變更 |
| memory-preference 只存在於新的表格定義中 | ALTER memory-preference |
| memory-preference 只存在於現有的表格定義中 | 保留在記憶體中否 |
- 已維護授權使用者。 物件擁有者可以變更。
- 保留現行異動日誌審核。 不過,與其他物件不同,表格的 REPLACE 將產生 ZC (變更物件) 日誌登載審核項目。
- 保留現行資料日誌登載。
- 除非 REPLACE 使用 AS 子句,否則會保留註解和標籤及直欄標題。
- 可能的話,會保留觸發程式。 如果無法保留觸發程式,則會傳回錯誤。
- 可能的話,會保留遮罩及許可權。 如果無法保留遮罩或許可權,則會傳回錯誤。
- 會保留時間表格 VERSIONING 及歷程表。
- 如果可能的話,將保留或重建任何相依於表格的視圖、具體化查詢表格及索引。 如果無法保留相依視圖、具體化查詢表格或索引,則會傳回錯誤。
使用身分直欄: 當表格具有身分直欄時,當橫列插入表格時,資料庫管理程式可以自動產生直欄的循序數值。 因此,身分直欄很適合主要索引鍵。
身分直欄和 ROWID 直欄類似,因為這兩種類型的直欄都包含資料庫管理程式所產生的值。 在直接列存取中, ROWID 直欄可能很有用。 ROWID 直欄包含 ROWID 資料類型的值,它會傳回 40 位元組 VARCHAR 值,且不會定期遞增或遞減。 因此, ROWID 資料值並不適合許多應用程式使用,例如產生員工編號或產品編號。 對於不需要直接列存取的資料,身分直欄通常是較好的方法,因為身分直欄包含現有的數值資料類型,且可用於 ROWID 值不適用的各種用途。
當表格回復至復原點 (使用 RMVJRNCHG) 時,可能會在為識別直欄產生的值序列中產生較大的間隙。 例如,假設表格具有身分直欄,其增量值為 1 ,且前次在 T1 時產生的值為 100 ,資料庫管理程式隨後會產生高達 1000 的值。 現在,假設表格已回復至時間 T1。 在回復完成之後所插入下一列的身分直欄所產生的值將為 1001 ,在身分直欄的值中留下 100 到 1001 的間隙。
當指定 CYCLE 時,即使直欄是 GENERATED ALWAYS ,也可能會產生直欄的重複值,除非在直欄上定義唯一限制或唯一索引。
建立具體化查詢表格: 若要確保具體化查詢表格在由查詢使用之前具有資料,請執行下列動作:
- 應該使用 DATA INITIALLY IMMEDIATE 來建立具體化查詢表格,或
- 應該在停用查詢最佳化的情況下建立具體化查詢表格,然後在重新整理表格之後啟用該表格以進行查詢最佳化。
執行 CREATE TABLE 陳述式時的隔離層次是具體化查詢表格的隔離層次。 isolation-clause 可用來明確指定隔離層次。
隱含地隱藏直欄的考量: 定義為隱含地隱藏的直欄不是在 SELECT 清單中指定 * 之查詢的結果表格的一部分。 不過,在查詢中可以明確參照隱含地隱藏的直欄。 例如,可以在 SELECT 清單或查詢的述詞中參照隱含地隱藏的直欄。 此外,可以在 COMMENT 陳述式、CREATE INDEX 陳述式、ALTER TABLE 陳述式、INSERT 陳述式、MERGE 陳述式或 UPDATE 陳述式中明確參照隱含地隱藏的直欄。 在參照限制中可以參照隱含地隱藏的直欄。 不包含直欄清單的 REFERENCES 子句隱含地參照母表格的主要索引鍵。 母表格的主要索引鍵可能包含定義為隱式隱藏的直欄。 容許此類參照限制。
如果具體化查詢定義的全選 SELECT 清單明確參照隱含地隱藏的直欄,則該直欄將成為具體化查詢表格的一部分。
如果視圖定義 (CREATE VIEW 陳述式) 全選的 SELECT 清單明確參照隱含地隱藏的直欄,則該直欄會成為視圖的一部分,不過不會將視圖直欄視為「隱藏」。
COALESCE (transaction_start_id_col, row_begin_col)
CASE WHEN transaction_start_id_col IS NOT NULL
THEN transaction_start_id_col
ELSE row_begin_col END- 名為 SYSTEM_TIME 的系統期間,使用 row-begin 直欄及 row-end 直欄來定義。 請參閱 AS ROW BEGIN、AS ROW END 及 PERIOD-DEFINITION 的說明。
- transaction-start-ID 直欄。 請參閱 AS TRANSACTION START ID 的說明。
- 在後續 ALTER TABLE 陳述式上指定的系統期間資料版本化定義,指定 ADD VERSIONING 動作,其中包括相關聯歷程表的名稱。 請參閱 ADD VERSIONING USE HISTORY TABLE history-table-name。
分割表格效能: 分割表格中的分割區數目越大, SQL 資料變更及 SQL 資料陳述式中的額外負擔越大。 您應該建立分割表格,其中包含最小化此額外負擔所需的分割區數目下限。
使用遠端 select 陳述式建立表格: as-result-table 的 select 陳述式 可以參照與建立表格所在伺服器不同的表格。 可以使用三段式物件名稱或別名來完成此作業,該別名定義為參照表格或視圖的三段式名稱。 select-statement 不能用於具體化查詢表格,且結果不能包含已定義欄位程序的直欄。 如果遠端伺服器是 Db2 for LUW 或 Db2 for z/OS®,則不容許 copy-options 。 如果遠端伺服器是 Db2 for LUW ,則應該在 AS 關鍵字之前明確指定直欄清單。
替代語法: 下列關鍵字是支援與舊版相容的同義字。 這些關鍵字非標準且不應使用:
- INLINE LENGTH 是 ALLOCATE 的同義字。
- constraint-name (不含 CONSTRAINT 關鍵字) 可以指定在 參照限制 中 FOREIGN KEY 關鍵字後面
- DEFINITION ONLY 是 WITH NO DATA 的同義字
- PARTITIONING KEY 是 DISTRIBUTE BY HASH 的同義字。
- PART 是 PARTITION 的同義字。
- 可以指定 PARTITION partition-number ,而不是 PARTITION partition-name。 partition-number 不得識別先前在 CREATE TABLE 陳述式中指定的分割區。
如果未指定 partition-number ,則資料庫管理程式會產生唯一分割區號碼。
- VALUES 是 ENDING AT 的同義字。
- 建立具體化查詢表格時 CREATE 與 TABLE 之間的 SUMMARY。
列大小上限
column-definition的說明中有兩個最大列大小限制。
- 列緩衝區大小上限為 32766 ,如果指定 VARCHAR、VARGRAPHIC、VARBINARY、LOB 或 XML 直欄,則為 32740。
- 如果指定 LOB 或 XML 直欄,則列資料大小上限為 3 758 096 383; 當插入或更新列時,會決定此大小。 如果未指定 LOB 或 XML 直欄,則列資料大小上限為 32766 ,如果指定 VARCHAR、VARGRAPHIC 或 VARBINARY 直欄,則為 32740。
若要決定橫列緩衝區及/或橫列資料的長度,請根據資料類型的位元組計數,新增該橫列每一個直欄的對應長度。
下表針對不容許空值的直欄,依資料類型提供直欄的位元組計數。 如果任何直欄容許空值,則每八個直欄需要一個位元組。 根據欄位程序的結果,具有欄位程序的直欄可能會有不同的計數。
| 資料類型 | 列緩衝區位元組計數 | 列資料位元組計數 |
|---|---|---|
| SMALLINT | 2 | 2 |
| INTEGER | 4 | 4 |
| BIGINT | 8 | 8 |
| DECIMAL ( p, s) | (p/2) + 1 的整數部分 | (p/2) + 1 的整數部分 |
| NUMERIC ( p, s) | p | p |
| FLOAT (單一精準度) | 4 | 4 |
| FLOAT (倍精準度) | 8 | 8 |
| DECFLOAT (16) | 8 | 8 |
| DECFLOAT (34) | 16 | 16 |
| CHAR ( n) | n | n |
| VARCHAR ( n) | n+ 2 | n+ 2 |
| CLOB ( n) | 29 +填補 | n+29 |
| GRAPHIC (n) | n* 2 | n* 2 |
| VARGRAPHIC (n) | n* 2 + 2 | n* 2 + 2 |
| DBCLOB ( n) | 29 +填補 | n* 2 + 29 |
| BINARY ( n) | n | n |
| VARBINARY ( n) | n+ 2 | n+ 2 |
| BLOB ( n) | 29 +填補 | n+29 |
| DATE | 10 | 4 |
| 時間 | 8 | 3 |
| TIMESTAMP (p) | 當 p 為 0 時,則為 19; 否則為 20 +p | ((p+ 1 )/ 2) + 7 的整數部分 |
BOOLEAN![]() |
1![]() |
1![]() |
| DATALINK ( n) | n+24 | n+24 |
| ROWID | 42 | 28 |
| XML | 29 +填補 | 2 147 483 647 |
| distinct-type | 來源類型的位元組計數。 | 來源類型的位元組計數。 |
附註:
填補 是界限對齊的必要值,從 1 到 15。 |
||
如對資料庫所說明的精準度:
- 浮點欄位定義在 Db2 for i 資料庫中,具有小數精準度,而非位元精準度。 用來將位元數轉換為小數的演算法是 decimal precision = ceiling (n/3.31), 其中 n 是要轉換的位元數。 小數位數是用來決定使用互動式 SQL 要顯示的位數。
- 儲存 SMALLINT 欄位的小數位數為 4,0。
- INTEGER 欄位儲存時的小數位數為 9,0。
- 儲存 BIGINT 欄位時,小數位數為 19,0。
LONG VARCHAR、LONG VARGRAPHIC 及 LONG VARBINARY
支援 LONG VARCHAR、LONG VARGRAPHIC 及 LONG VARBINARY 的非標準語法,但已淘汰。 偏好 VARCHAR (整數)、VARGRAPHIC (整數) 及 VARBINARY (整數) 的替代標準語法。 建議使用 VARCHAR (整數)、VARGRAPHIC (整數) 及 VARBINARY (整數)。 處理 CREATE TABLE 陳述式之後,資料庫管理程式會將 LONG VARCHAR 直欄視為 VARCHAR ,將 LONG VARGRAPHIC 直欄視為 VARGRAPHIC ,並將 LONG VARBINARY 直欄視為 VARBINARY。 以非可攜式的產品特定方式來計算長度上限。
LONG 直欄的長度上限如下所示。 讓:
i是表格中不是 LONG VARCHAR、LONG VARGRAPHIC 或 LONG VARBINARY 之所有直欄的列緩衝區位元組計數總和j是表格中 LONG VARCHAR、LONG VARGRAPHIC 及 LONG VARBINARY 直欄的數目k是列中容許空值的欄數。
每一個 LONG VARCHAR 及 LONG VARBINARY 直欄的長度是 INTEGER (((32716- i-((k+ 7 )/ 8)))/j)。
每一個 LONG VARGRAPHIC 直欄的長度是由 LONG VARCHAR 直欄計算的長度除以 2 來決定。 結果的整數部分是長度。
系統名稱產生的規則
當系統產生系統表格、視圖、索引或直欄名稱時,會有特定的實例。 下列各節說明這些實例及名稱產生規則。
直欄名稱產生的規則
如果建立表格或視圖時未指定 system-column-name ,且 column-name 不是有效的 system-column-name ,則會產生 system-column-name。
如果直欄名稱不包含特殊字元且長度超過 10 個字元,則 10 個字元的系統直欄名稱將產生為:
- 名稱的前 5 個字元
- 5 位數唯一號碼
例如:
The system-column-name for LONGCOLUMNNAME would be LONGC00001如果直欄名稱有定界字元:
- 定界字元內的前 5 個字元將用作 system-column-name 的前 5 個字元。 如果定界字元內少於 5 個字元,則名稱將在右側以底線 (_) 字元填補。 小寫字元會摺疊成大寫字元。 系統直欄名稱中唯一有效的字元為 :A-Z、0-9、@、#、$及 _。任何其他字元將變更為底線 (_) 字元。 如果第一個字元結尾是底線,則會變更為字母 Q。
- 5 個字元後面會附加一個 5 位數的唯一數字。
例如:
The system-column-name for "abc" would be ABC__00001
The system-column-name for "COL2.NAME" would be COL2_00001
The system-column-name for "C 3" would be C_3__00001
The system-column-name for "??" would be Q____00001
The system-column-name for "*column1" would be QCOLU00001產生表格名稱的規則
如果 未使用 FOR SYSTEM NAME 子句建立表格、視圖、別名或索引,且具有下列任一,則會產生系統名稱:
- 名稱長度超過 10 個字元
- 在系統名稱中包含無效字元的名稱
SQL 名稱或其對應的系統名稱可以在 SQL 陳述式中同時使用,以在建立檔案之後存取該檔案。 不過,只有 Db2 for i 才能辨識 SQL 名稱,且系統名稱必須在其他環境中使用。
有兩種不同的方法可產生系統名稱:
- 如果在建立表格的相同綱目中存在名稱為 QGENOBJNAM 的資料區,則使用者可以影響產生的名稱。
資料區受到下列限制:
- 使用者必須獲得授權,才能讀取資料區。
- 資料區必須具有 CHAR (10) 的屬性。
- 資料區值的前 5 個字元必須是 '?????'。
- 資料區值接下來的 5 個字元必須包含 5 個數字。
如果未滿足上述任何條件,或在存取資料區中的起始值時發生任何錯誤,則會使用預設名稱產生規則,如同資料區根本不存在一樣。
如果資料區符合上述所有限制,則產生的名稱將與下列預設名稱產生規則相同,但在名稱的前 5 個 (或 4 個) 字元之後,唯一號碼最初將包含資料區中指定的 5 個數字 (而不是 '00001' 或 '0001')。
例如,如果資料區的值為 '???????00999':
The system name for "??" would be "__00999" The system name for "longtablename" would be "lon00999" The system name for "LONGTableName" would be LONG00999 The system name for "A b " would be "A_b00999" - 否則,會使用預設名稱產生規則:
如果名稱不包含特殊字元且長度超過 10 個字元,則會產生 10 個字元的系統名稱如下:
- 名稱的前 5 個字元
- 5 位數唯一號碼
例如:
The system name for LONGTABLENAME would be LONGT00001如果 SQL 名稱包含特殊字元,則系統名稱會產生為:
- 名稱的前 4 個字元
- 4 位數唯一號碼
此外:
- 所有特殊字元都會取代為底線 (_)
- 從名稱中移除任何尾端空白
- 名稱以雙引號 (") 區隔 如果名稱需要定界字元才能成為有效的系統名稱。
例如:
The system name for "??" would be "__0001" The system name for "longtablename" would be "long0001" The system name for "LONGTableName" would be LONG0001 The system name for "A b " would be "A_b0001"SQL 透過搜尋交互參照檔案來確保系統名稱是唯一的。 如果名稱已存在於交互參照檔案中,則號碼會遞增,直到名稱不再重複為止。
如果無法使用上述規則來判斷唯一名稱,則會在名稱的計數器中新增額外的字元,並增加數字,直到找到唯一名稱或耗盡範圍為止。 例如,如果建立 "longtablename" 且名稱 "long0001" 至 "long9999" 已存在,則名稱會變成 "lon00001"。
範例
範例 1: 給定 資料庫管理者權限,建立名為 'ROSSITER.INVENTORY:
- 產品號碼
- 小整數,不得為空值
- 說明
- 長度為 0 到 24 的字元,容許空值
- 手頭的數量
- 整數容許空值
CREATE TABLE ROSSITER.INVENTORY
(PARTNO SMALLINT NOT NULL,
DESCR VARCHAR(24),
QONHAND INT)範例 2: 使用下列直欄建立名為 DEPARTMENT 的表格:
- 部門編號
- 長度為 3 的字元不得為空值
- 部門名稱
- 長度為 0 到 36 的字元,不得為空值
- 管理員號碼
- 長度為 6 的字元
- 行政部
- 長度為 3 的字元不得為空值
- 位置名稱
- 長度為 16 的字元,容許空值
主要索引鍵是直欄 DEPTNO。
CREATE TABLE DEPARTMENT
(DEPTNO CHAR(3) NOT NULL,
DEPTNAME VARCHAR(36) NOT NULL,
MGRNO CHAR(6),
ADMRDEPT CHAR(3) NOT NULL,
LOCATION CHAR(16),
PRIMARY KEY(DEPTNO))範例 3: 建立名為 REORG_PROJECTS 的表格,其直欄定義與視圖 PRJ_LEADER 中的直欄相同。
CREATE TABLE REORG_PROJECTS
LIKE PRJ_LEADER範例 4: 使用名為 EMP_NO 的身分直欄建立 EMPLOYEE2 表格。 定義身分直欄,以便 Db2 for i 一律產生直欄的值。 對於應指派的第一個值,以及後續產生的連續數字之間的增量差異,請使用預設值 1。
CREATE TABLE EMPLOYEE2
( EMPNO INTEGER GENERATED ALWAYS AS IDENTITY,
ID SMALLINT,
NAME CHAR(30),
SALARY DECIMAL(5,2),
DEPTNO SMALLINT)範例 5: 假設一個名為 TRANS 的非常大的交易表格,對於公司所處理的每一個交易都包含一列。 表格定義了許多直欄。 為 TRANS 表格建立具體化查詢表格,其中包含交易日期及數量的每日摘要資料。
CREATE TABLE STRANS
AS (SELECT YEAR AS SYEAR, MONTH AS SMONTH, DAY AS SDAY, SUM(AMOUNT) AS SSUM
FROM TRANS
GROUP BY YEAR, MONTH, DAY )
DATA INITIALLY DEFERRED
REFRESH DEFERRED
MAINTAINED BY USER 範例 6: 建立使用 SYSTEM_TIME 期間的表格 policy_info,並建立歷程表 hist_policy_info。 然後發出 ALTER TABLE 陳述式,將 policy_info 表格與 hist_policy_info 表格相關聯。
CREATE TABLE policy_info
(policy_id CHAR(10) NOT NULL,
coverage INT NOT NULL,
sys_start TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS ROW BEGIN,
sys_end TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS ROW END,
create_id TIMESTAMP(12) GENERATED ALWAYS AS TRANSACTION START ID,
PERIOD SYSTEM_TIME(sys_start,sys_end))
CREATE TABLE hist_policy_info
(policy_id CHAR(10) NOT NULL,
coverage INT NOT NULL,
sys_start TIMESTAMP(12) NOT NULL,
sys_end TIMESTAMP(12) NOT NULL,
create_id TIMESTAMP(12))
ALTER TABLE policy_info
ADD VERSIONING USE HISTORY TABLE hist_policy_info 也可以使用下列方式來建立歷程表,因為不會針對 LIKE 複製產生的屬性:CREATE TABLE hist_policy_info
LIKE policy_info 