CREATE TABLE
允許所有儲存引擎使用表格和欄位 CHECK
限制條件的核心功能。CREATE TABLE
允許以下 CHECK
限制條件語法,適用於表格限制條件和欄位限制條件
[CONSTRAINT [symbol]] CHECK (expr) [[NOT] ENFORCED]
可選的 symbol
指定限制條件的名稱。如果省略,MySQL 會從表格名稱、字面文字 _chk_
和序數 (1, 2, 3, ...) 產生名稱。限制條件名稱的最大長度為 64 個字元。它們區分大小寫,但不區分重音符號。
expr
將限制條件指定為布林運算式,對於表格的每一列,該運算式必須評估為 TRUE
或 UNKNOWN
(針對 NULL
值)。如果條件評估為 FALSE
,則會失敗並發生限制條件違規。違規的效果取決於正在執行的陳述式,如本節稍後所述。
可選的強制子句表示是否強制執行限制條件。
如果省略或指定為
ENFORCED
,則會建立並強制執行限制條件。如果指定為
NOT ENFORCED
,則會建立限制條件,但不強制執行。
CHECK
限制條件指定為表格限制條件或欄位限制條件
表格限制條件不會出現在欄位定義中,且可以參考任何表格欄位或多個欄位。允許正向參考表格定義中稍後出現的欄位。
欄位限制條件會出現在欄位定義中,且只能參考該欄位。
考慮以下表格定義
CREATE TABLE t1
(
CHECK (c1 <> c2),
c1 INT CHECK (c1 > 10),
c2 INT CONSTRAINT c2_positive CHECK (c2 > 0),
c3 INT CHECK (c3 < 100),
CONSTRAINT c1_nonzero CHECK (c1 <> 0),
CHECK (c1 > c3)
);
定義包含具名和未命名的格式的表格限制條件和欄位限制條件
第一個限制條件是表格限制條件:它出現在任何欄位定義之外,因此它可以 (而且確實) 參考多個表格欄位。此限制條件包含對尚未定義之欄位的正向參考。未指定限制條件名稱,因此 MySQL 會產生名稱。
接下來的三個限制條件是欄位限制條件:每個限制條件都出現在欄位定義中,因此只能參考正在定義的欄位。其中一個限制條件會明確命名。MySQL 會為其他兩個限制條件產生名稱。
最後兩個限制條件是表格限制條件。其中一個會明確命名。MySQL 會為另一個產生名稱。
如前所述,MySQL 會為任何未指定的 CHECK
限制條件產生名稱。若要查看為上述表格定義產生的名稱,請使用 SHOW CREATE TABLE
mysql> SHOW CREATE TABLE t1\G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`c1` int(11) DEFAULT NULL,
`c2` int(11) DEFAULT NULL,
`c3` int(11) DEFAULT NULL,
CONSTRAINT `c1_nonzero` CHECK ((`c1` <> 0)),
CONSTRAINT `c2_positive` CHECK ((`c2` > 0)),
CONSTRAINT `t1_chk_1` CHECK ((`c1` <> `c2`)),
CONSTRAINT `t1_chk_2` CHECK ((`c1` > 10)),
CONSTRAINT `t1_chk_3` CHECK ((`c3` < 100)),
CONSTRAINT `t1_chk_4` CHECK ((`c1` > `c3`))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
SQL 標準指定所有類型的限制條件 (主鍵、唯一索引、外鍵、檢查) 都屬於相同的命名空間。在 MySQL 中,每個限制條件類型在每個結構描述 (資料庫) 中都有自己的命名空間。因此,CHECK
限制條件名稱在每個結構描述中必須是唯一的;同一結構描述中的兩個表格不能共用 CHECK
限制條件名稱。(例外狀況:TEMPORARY
表格會隱藏具有相同名稱的非 TEMPORARY
表格,因此它也可以具有相同的 CHECK
限制條件名稱。)
以表格名稱開頭產生限制條件名稱有助於確保結構描述的唯一性,因為表格名稱在結構描述中也必須是唯一的。
CHECK
條件運算式必須遵循以下規則。如果運算式包含不允許的建構,則會發生錯誤。
允許非產生和產生欄位,但具有
AUTO_INCREMENT
屬性的欄位和其他表格中的欄位除外。允許使用常值、確定性內建函數和運算子。如果表格中的資料相同,則函數是確定性的,多次叫用會產生相同的結果,且與連線的使用者無關。非確定性且無法通過此定義的函數範例:
CONNECTION_ID()
、CURRENT_USER()
、NOW()
。不允許使用預存函數和可載入函數。
不允許使用預存程序和函數參數。
不允許使用變數 (系統變數、使用者定義變數和預存程式本機變數)。
不允許使用子查詢。
禁止在 CHECK
限制條件中使用的欄位上使用外鍵參考動作 (ON UPDATE
、ON DELETE
)。同樣地,禁止在用於外鍵參考動作的欄位上使用 CHECK
限制條件。
會針對 INSERT
、UPDATE
、REPLACE
、LOAD DATA
和 LOAD XML
陳述式評估 CHECK
限制條件,如果限制條件評估為 FALSE
,則會發生錯誤。如果發生錯誤,則已套用的變更處理方式對於交易式和非交易式儲存引擎有所不同,也取決於是否啟用嚴格的 SQL 模式,如 嚴格的 SQL 模式所述。
會針對 INSERT IGNORE
、UPDATE IGNORE
、LOAD DATA ... IGNORE
和 LOAD XML ... IGNORE
陳述式評估 CHECK
限制條件,如果限制條件評估為 FALSE
,則會發生警告。會略過任何冒犯行的插入或更新。
如果限制條件運算式評估為與宣告的欄位類型不同的資料類型,則會根據一般的 MySQL 類型轉換規則隱含強制轉換為宣告的類型。請參閱第 14.3 節「運算式評估中的類型轉換」。如果類型轉換失敗或導致精確度損失,則會發生錯誤。
限制條件運算式評估使用評估時生效的 SQL 模式。如果運算式的任何元件取決於 SQL 模式,則在不同使用表格的情況下可能會發生不同的結果,除非在所有使用期間 SQL 模式都相同。
資訊結構描述 CHECK_CONSTRAINTS
表格提供有關表格上定義的 CHECK
限制條件的資訊。請參閱第 28.3.5 節「INFORMATION_SCHEMA CHECK_CONSTRAINTS 表格」。