SQL Check
1. 定義
慕課解釋:
Check
約束用于限制字段值的范圍;Check
既可以定義在單個字段上,也可以在定義在表上對特定字段進行約束。
2. 前言
本小節,我們將一起學習SQL Check
。
前面的小節中,我們談到了諸多數據類型和約束;如果說數據類型是對數據的第一層約束,那么Check
便是數據的第二層約束,Check 可以在數據庫層面上篩選掉不符合約束的數據。
3. 創建時約束
Check 可以直接在創建數據表時給字段加上約束。
3.1 例1 字段上約束
請書寫 SQL 語句,新建imooc_user
表,共有 id,username,age 三個字段,且為 age 字段添加上 Check 約束,規定所有 age 必須大于0
。
分析:
使用 Create 指令新建數據表,并通過 Check 給 age 加上>0
的約束。
語句:
整理可得語句如下:
CREATE TABLE imooc_user
(
id int PRIMARY KEY,
username varchar(20),
age int CHECK(age > 0)
);
創建成功后,若插入的數據不滿足條件,插入會失敗,如下:
insert into imooc_user values(2,'pedro',0);
(3819, "Check constraint 'imooc_user_chk_1' is violated.")
3.2 例2 數據表上約束
Check 不僅可以作用在字段上,還可以直接在數據表上。
請書寫 SQL 語句,新建imooc_user
表,共有 id,username,age 三個字段,且為 age 字段添加上 Check 約束,規定所有 age 必須大于0
且小于1000
。
分析:
同例1。
語句:
整理可得語句如下:
CREATE TABLE imooc_user
(
id int PRIMARY KEY,
username varchar(20),
age int,
CHECK(age > 0 AND age < 1000)
);
4. Alter 時更改約束
數據表還可以在修改時添加Check
約束或者刪除約束。
4.1 例3 Alter 添加約束
請書寫SQL語句,為imooc_user
表的 username 字段添加上 Check 約束,規定 username 只能為peter
。
分析:
使用 Alter 指令修改 imooc_user 表,并為 username 字段添加上約束。
語句:
整理可得語句如下:
ALTER TABLE imooc_user ADD CONSTRAINT username_constraint CHECK(username='peter');
4.2 例4 Alter 刪除約束
請書寫 SQL 語句,刪除imooc_user
表的 username 字段約束。
分析:
使用 Alter 指令修改 imooc_user 表,刪除掉 username 字段上的約束。
語句:
(MySQL下)整理可得語句如下:
ALTER TABLE imooc_user DROP CHECK username_constraint;
如果是 PostgreSQL 會有些許不同,語句如下:
ALTER TABLE imooc_user DROP CONSTRAINT username_constraint;
5. 小結
- Check 雖然可以約束字段,但是會影響數據插入和更新的速度,降低數據庫性能,因此一般都不推薦使用 Check。