文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
資訊 (Gzip) - 4.0Mb
資訊 (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  CHECK 限制條件

15.1.20.6 CHECK 限制條件

CREATE TABLE 允許所有儲存引擎使用表格和欄位 CHECK 限制條件的核心功能。CREATE TABLE 允許以下 CHECK 限制條件語法,適用於表格限制條件和欄位限制條件

[CONSTRAINT [symbol]] CHECK (expr) [[NOT] ENFORCED]

可選的 symbol 指定限制條件的名稱。如果省略,MySQL 會從表格名稱、字面文字 _chk_ 和序數 (1, 2, 3, ...) 產生名稱。限制條件名稱的最大長度為 64 個字元。它們區分大小寫,但不區分重音符號。

expr 將限制條件指定為布林運算式,對於表格的每一列,該運算式必須評估為 TRUEUNKNOWN (針對 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 UPDATEON DELETE)。同樣地,禁止在用於外鍵參考動作的欄位上使用 CHECK 限制條件。

會針對 INSERTUPDATEREPLACELOAD DATALOAD XML 陳述式評估 CHECK 限制條件,如果限制條件評估為 FALSE,則會發生錯誤。如果發生錯誤,則已套用的變更處理方式對於交易式和非交易式儲存引擎有所不同,也取決於是否啟用嚴格的 SQL 模式,如 嚴格的 SQL 模式所述。

會針對 INSERT IGNOREUPDATE IGNORELOAD DATA ... IGNORELOAD XML ... IGNORE 陳述式評估 CHECK 限制條件,如果限制條件評估為 FALSE,則會發生警告。會略過任何冒犯行的插入或更新。

如果限制條件運算式評估為與宣告的欄位類型不同的資料類型,則會根據一般的 MySQL 類型轉換規則隱含強制轉換為宣告的類型。請參閱第 14.3 節「運算式評估中的類型轉換」。如果類型轉換失敗或導致精確度損失,則會發生錯誤。

注意

限制條件運算式評估使用評估時生效的 SQL 模式。如果運算式的任何元件取決於 SQL 模式,則在不同使用表格的情況下可能會發生不同的結果,除非在所有使用期間 SQL 模式都相同。

資訊結構描述 CHECK_CONSTRAINTS 表格提供有關表格上定義的 CHECK 限制條件的資訊。請參閱第 28.3.5 節「INFORMATION_SCHEMA CHECK_CONSTRAINTS 表格」