
- SQL 教程
- SQL - 首頁
- SQL - 概述
- SQL - RDBMS 概念
- SQL - 資料庫
- SQL - 語法
- SQL - 資料型別
- SQL - 運算子
- SQL - 表示式
- SQL 資料庫
- SQL - 建立資料庫
- SQL - 刪除資料庫
- SQL - 選擇資料庫
- SQL - 重新命名資料庫
- SQL - 顯示資料庫
- SQL - 備份資料庫
- SQL 表
- SQL - 建立表
- SQL - 顯示錶
- SQL - 重命名錶
- SQL - 截斷表
- SQL - 克隆表
- SQL - 臨時表
- SQL - 修改表
- SQL - 刪除表
- SQL - 刪除表
- SQL - 約束
- SQL 查詢
- SQL - 插入查詢
- SQL - 選擇查詢
- SQL - SELECT INTO
- SQL - INSERT INTO SELECT
- SQL - 更新查詢
- SQL - 刪除查詢
- SQL - 排序結果
- SQL 檢視
- SQL - 建立檢視
- SQL - 更新檢視
- SQL - 刪除檢視
- SQL - 重新命名檢視
- SQL 運算子和子句
- SQL - WHERE 子句
- SQL - TOP 子句
- SQL - DISTINCT 子句
- SQL - ORDER BY 子句
- SQL - GROUP BY 子句
- SQL - HAVING 子句
- SQL - AND & OR
- SQL - 布林 (BIT) 運算子
- SQL - LIKE 運算子
- SQL - IN 運算子
- SQL - ANY, ALL 運算子
- SQL - EXISTS 運算子
- SQL - CASE
- SQL - NOT 運算子
- SQL - 不等於
- SQL - IS NULL
- SQL - IS NOT NULL
- SQL - NOT NULL
- SQL - BETWEEN 運算子
- SQL - UNION 運算子
- SQL - UNION vs UNION ALL
- SQL - INTERSECT 運算子
- SQL - EXCEPT 運算子
- SQL - 別名
- SQL 連線
- SQL - 使用連線
- SQL - 內連線
- SQL - 左連線
- SQL - 右連線
- SQL - 交叉連線
- SQL - 全連線
- SQL - 自連線
- SQL - 刪除連線
- SQL - 更新連線
- SQL - 左連線 vs 右連線
- SQL - UNION vs JOIN
- SQL 鍵
- SQL - 唯一鍵
- SQL - 主鍵
- SQL - 外部索引鍵
- SQL - 組合鍵
- SQL - 備選鍵
- SQL 索引
- SQL - 索引
- SQL - 建立索引
- SQL - 刪除索引
- SQL - 顯示索引
- SQL - 唯一索引
- SQL - 聚簇索引
- SQL - 非聚簇索引
- 高階 SQL
- SQL - 萬用字元
- SQL - 註釋
- SQL - 注入
- SQL - 託管
- SQL - MIN & MAX
- SQL - NULL 函式
- SQL - 檢查約束
- SQL - 預設約束
- SQL - 儲存過程
- SQL - NULL 值
- SQL - 事務
- SQL - 子查詢
- SQL - 處理重複項
- SQL - 使用序列
- SQL - 自動遞增
- SQL - 日期和時間
- SQL - 遊標
- SQL - 公共表表達式
- SQL - GROUP BY vs ORDER BY
- SQL - IN vs EXISTS
- SQL - 資料庫調優
- SQL 函式參考
- SQL - 日期函式
- SQL - 字串函式
- SQL - 聚合函式
- SQL - 數值函式
- SQL - 文字和影像函式
- SQL - 統計函式
- SQL - 邏輯函式
- SQL - 遊標函式
- SQL - JSON 函式
- SQL - 轉換函式
- SQL - 資料型別函式
- SQL 有用資源
- SQL - 問答
- SQL - 快速指南
- SQL - 有用函式
- SQL - 有用資源
- SQL - 討論
SQL - 檢查約束
SQL CHECK 約束
SQL 的CHECK 約束用於向表的列新增條件。
在列上新增檢查約束後,它可確保輸入到該列的資料滿足指定的條件。如果特定記錄不滿足這些條件,則資料庫將阻止您插入或更新該記錄。
假設我們有一個名為 CUSTOMERS 的表,其中包含一個 AGE 列。我們可以在此列上新增CHECK 約束,以確保輸入的年齡始終為正數且不超過 50 歲。如果有人試圖輸入負年齡或超過 50 歲的年齡,資料庫將拒絕它,確保您的資料保持準確和有效。
單列檢查約束
要在列級別新增檢查約束,我們必須在建立表時在列名之後指定檢查約束。
語法
以下是指定單列檢查約束的語法:
CREATE TABLE table_name ( column_name data_type CHECK (condition) );
示例
在下面的查詢中,我們正在建立一個名為 CUSTOMERS 的表。在這裡,我們正在 AGE 列上指定列級檢查約束,該約束僅允許插入客戶年齡值大於“20”的記錄:
CREATE TABLE CUSTOMERS ( ID INT NOT NULL, NAME VARCHAR (20) NOT NULL, AGE INT NOT NULL CHECK(AGE>=20), ADDRESS CHAR (25), SALARY DECIMAL (18, 2), PRIMARY KEY (ID) );
驗證
要驗證是否已向 AGE 列新增檢查約束,我們可以在 MySQL 資料庫中使用以下查詢:
SELECT table_name, constraint_type, constraint_name FROM information_schema.table_constraints WHERE table_name='CUSTOMERS';
輸出
上述查詢將顯示 CUSTOMERS 表的所有詳細資訊,包括有多少列具有檢查約束以及我們在表中指定了哪些約束,如下所示:
表名 | 約束型別 | 約束名 |
---|---|---|
customers | 主鍵 | PRIMARY |
customers | 主鍵 | PRIMARY |
customers | 主鍵 | PRIMARY |
customers | 主鍵 | PRIMARY |
customers | 檢查 | employees_chk_1 |
現在,要驗證 CHECK 約束是否正常工作,讓我們向 CUSTOMERS 中插入一條記錄,其中 AGE 包含小於 20 的值(不滿足給定條件):
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES (1, 'Ramesh', 15, 'Ahmedabad', 2000.00 );
上述查詢的輸出如下所示:
ERROR 3819 (HY000): Check constraint 'customers_chk_1' is violated.
多列檢查約束
我們還可以透過指定必須滿足這些列的值組合的條件,在表的多個列上新增檢查約束。
假設我們有一個表,其中包含產品的詳細資訊,包括它們的開始日期和結束日期。我們可以新增一個 CHECK 約束,以確保結束日期始終大於或等於開始日期。在這種情況下,約束正在檢查同一行中兩列(開始日期和結束日期)的值,以確保它們遵循特定的關係。
示例
在下面的示例中,我們正在 CUSTOMERS 表的多個列(AGE 和 SALARY)上指定列級檢查約束。在這裡,AGE 列僅允許 AGE 大於或等於 20 的記錄,SALARY 列僅允許 SALARY 大於 20000 的記錄:
CREATE TABLE CUSTOMERS ( ID INT NOT NULL, NAME VARCHAR (20) NOT NULL, AGE INT NOT NULL CHECK(AGE >= 20), ADDRESS CHAR (25), SALARY DECIMAL (18, 2) CHECK(SALARY >= 20000), PRIMARY KEY (ID) );
驗證
要驗證檢查約束是否應用於這兩列,我們可以在 MySQL 資料庫中使用以下查詢:
SELECT table_name, constraint_type, constraint_name FROM information_schema.table_constraints WHERE table_name='CUSTOMERS';
輸出
它將顯示已建立表的全部詳細資訊,包括有多少列具有檢查約束以及我們在表中指定的約束:
表名 | 約束型別 | 約束名 |
---|---|---|
customers | 主鍵 | PRIMARY |
customers | 主鍵 | PRIMARY |
customers | 主鍵 | PRIMARY |
customers | 主鍵 | PRIMARY |
customers | 檢查 | customers_chk_1 |
customers | 檢查 | customers_chk_2 |
現在,我們正在向 CUSTOMERS 表中插入值,其中年齡小於 20,工資小於 20000。
INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) VALUES (1, 'Ramesh', 15, 'Ahmedabad', 2000.00 );
上述查詢丟擲錯誤,因為 AGE 和 SALARY 列中傳遞的值不滿足 CHECK 約束:
ERROR 3819 (HY000): Check constraint 'customers_chk_1' is violated.
表級檢查約束
為了確保表級檢查約束,我們必須在完成表建立之前使用檢查約束。
語法
以下是指定表級檢查約束的語法:
CREATE TABLE table_name ( column1 data_type, column2 data_type,..., CONSTRAINT constraint_name CHECK(column_name condition_value) );
示例
在以下 SQL 查詢中,我們正在建立一個名為 PRODUCTS 的表。在這裡,我們正在 DATE_OF_ORDER 列上指定表級檢查約束,該約束僅允許插入 DATE_OF_ORDER 小於(早於)“2023-02-09”的記錄:
CREATE TABLE PRODUCTS( PID INT NOT NULL, PNAME VARCHAR(30), DELIVERY_CITY VARCHAR(20), DATE_OF_ORDER Date NOT NULL, PRICE INT, PRIMARY KEY(PID), CONSTRAINT Constraint_DOO CHECK(DATE_OF_ORDER <= '2023-02-09') );
驗證
我們可以使用以下 SQL 查詢驗證已建立表上的 CHECK 約束:
SELECT table_name, constraint_type, constraint_name FROM information_schema.table_constraints WHERE table_name='PRODUCTS';
輸出
它將顯示已建立表的全部詳細資訊,包括表級別有多少列具有檢查約束,如下所示:
表名 | 約束型別 | 約束名 |
---|---|---|
products | 主鍵 | PRIMARY |
products | 檢查 | Constraint_DOO |
在這裡,我們正在向 PRODUCTS 中插入值,該值在 DATE_OF_ORDER 列上具有小於“2023-02-09”的約束:
INSERT INTO PRODUCTS VALUES (001, 'Nike Shoe', 'Ranchi', '2023-01-11', 2000);
以下是上述查詢的輸出:
Query OK, 1 row affected (0.01 sec)
現有列的檢查約束
我們可以使用ALTER TABLE語句向表的現有列新增檢查約束。
語法
以下是向現有表新增檢查約束的語法:
ALTER TABLE table_name ADD CONSTRAINT constraint_name CHECK(ColumnName condition_value);
示例
在以下查詢中,我們正在建立一個名為 CUSTOMERS 的表:
CREATE TABLE CUSTOMERS ( ID INT NOT NULL, NAME VARCHAR(20) NOT NULL, AGE INT NOT NULL, ADDRESS CHAR (25), SALARY DECIMAL (18, 2), PRIMARY KEY (ID) );
要向 AGE 列新增檢查約束,我們使用以下查詢:
ALTER TABLE CUSTOMERS ADD CONSTRAINT Constraint_Age CHECK (AGE >= 21);
驗證
要驗證表建立後是否應用了檢查約束,請使用以下 SQL 查詢:
SELECT table_name, constraint_type, constraint_name FROM information_schema.table_constraints WHERE table_name='CUSTOMERS';
輸出
它將顯示錶的全部資訊,包括我們新增到年齡列的約束:
表名 | 約束型別 | 約束名 |
---|---|---|
customers | 主鍵 | PRIMARY |
customers | 主鍵 | PRIMARY |
customers | 主鍵 | PRIMARY |
customers | 主鍵 | PRIMARY |
customers | 檢查 | Constraint_Age |
刪除檢查約束
如果有一種方法可以在列上新增約束,那麼您也必須能夠從該列中刪除約束。為此,可以使用ALTER DROP語句。
語法
以下是從表中刪除檢查約束的語法:
ALTER TABLE table_name DROP CONSTRAINT constraint_name;
示例
下面的示例顯示如何從上面建立的 CUSTOMERS 表中刪除檢查約束:
ALTER TABLE CUSTOMERS DROP CONSTRAINT Constraint_Age;
驗證
使用以下 SQL 查詢,我們正在驗證約束是否已刪除:
SELECT table_name, constraint_type, constraint_name FROM information_schema.table_constraints WHERE table_name='CUSTOMERS';
輸出
我們可以看到,新增到年齡列的檢查約束已刪除:
表名 | 約束型別 | 約束名 |
---|---|---|
customers | 主鍵 | PRIMARY |
customers | 主鍵 | PRIMARY |
customers | 主鍵 | PRIMARY |
customers | 主鍵 | PRIMARY |