1. 程式人生 > SQL入門教學 >20 SQL Check

20 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。