1. 程式人生 > SQL入門教學 >04 SQL Create 2

04 SQL Create 2

1. 前言

上一節中,我們一起學習了 SQL Create 和資料型別,本小節將站在SQL約束的角度上進一步的探討 Create 。

2. SQL 約束(Constraints)

SQL 約束用於在新建或修改資料表時,給資料表或資料表中的欄位加上約束條件

當然,你也可以把約束理解為修飾,如 PRIMARY KEY 可以修飾字段為主鍵,也可以約束該欄位非空。

常見的約束有如下幾種:

約束 作用
NOT NULL 欄位非空
DEFAULT 欄位預設值
UNIQUE 欄位唯一
PRIMARY KEY 主鍵
FOREIGN KEY 外來鍵
CHECK 校驗欄位

在本小節中,我們將主要介紹 NOT NULL,DEFAULT,UNIQUE,PRIMARY KEY 這些約束的用法,FOREIGN KEY 會在 SQL Primary Key & Foreign Key 小節詳細介紹,而 CHECK 將在 SQL Check 一節中詳細探討。

3. 語法

SQL 約束的使用語法如下:

CREATE TABLE [table_name]
(
  [col1] [datatype1] [constraints1],
  [col2] [datatype2] [constraints2],
  [col3] [datatype3] [constraints3]
, ...., [constraints4] );

其中table_name是資料表名稱,col表示欄位名,datatype表示欄位型別,constraints代表約束,它們的數字字尾 1,2 表示多個欄位以及多個約束。

提示: 約束既可以在欄位上,也可以在表上。一個欄位,或者一張表可以有多個約束。

4. NOT NULL,DEFAULT

NOT NULL,DEFAULT 是兩個頗為簡單的約束。

DEFAULT 會給欄位新增上預設值,若欄位在新增的時候沒有指定值,則使用預設值。

NOT NULL 表示一個欄位是非空的,當在插入或者修改時,如果欄位為空(NULL)則會報錯。

4.1 例1 新建 imooc_user 表1

請書寫 SQL 語句,建立imooc_user表,表共有四個欄位,分別是usernameagescore,其中username為非空欄位,score欄位預設為0分。

分析:

imooc_user 表共有四個欄位,其中 username 為使用者名稱,使用字串表示,且每個人的使用者名稱長短不一,為可變短文字,即 varchar,該欄位非空,用 NOT NULL 約束;age 代表年齡,是典型的整數型別,即 int;score 代表分數,是典型的浮點數型別,即 float,預設為 0 分,用 DEFAULT 約束。

語句:

整理可得語句如下:

CREATE TABLE imooc_user
(
  username varchar(20) NOT NULL,
  age int,
  score float DEFAULT 0
);

執行成功後,得到 imooc_user 表的資訊如下:

+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| username | varchar(20) | NO   |     | <null>  |       |
| age      | int(11)     | YES  |     | <null>  |       |
| score    | float       | YES  |     | 0       |       |
+----------+-------------+------+-----+---------+-------+

5. PRIMARY KEY

PRIMARY KEY,中文稱主鍵,用於唯一標識資料表中的每一條記錄。

主鍵必須是唯一的,即每條記錄的主鍵必須各不相同;主鍵不能為空。

每張資料表都應該有一個主鍵,且每個表只能有一個主鍵。

5.1 例2 新建 imooc_user 表2

請書寫 SQL 語句,新建imooc_user表,表共有2欄位,分別是idusername,其中username為非空欄位,id欄位為主鍵。

分析

username 代表使用者名稱,使用字串表示,且每個人的使用者名稱長短不一,為可變短文字,即 varchar,該欄位非空,用 NOT NULL 約束; id 欄位作為主鍵,使用整型,且用 PRIMARY KEY 約束。

語句

整理可得語句如下:

CREATE TABLE imooc_user
(
  id int PRIMARY KEY,
  username varchar(20) NOT NULL
);

執行成功後,表的資訊如下:

+----------+------------------+------+-----+---------+-------+
| Field    | Type             | Null | Key | Default | Extra |
+----------+------------------+------+-----+---------+-------+
| id       | int(11)          | NO   | PRI | <null>  |       |
| username | varchar(20)      | NO   |     | <null>  |       |
+----------+------------------+------+-----+---------+-------+

PRIMARY KEY 也可用於約束多個欄位,即聯合主鍵

修改上面的例子,若 imooc_user 表中的idusername為聯合主鍵,則其新建語句如下:

CREATE TABLE imooc_user
(
  id int,
  username varchar(20) NOT NULL,
  CONSTRAINT user_pk PRIMARY KEY(id,username)
);

操作成功後,imooc_user 表資訊如下:

+----------+------------------+------+-----+---------+-------+
| Field    | Type             | Null | Key | Default | Extra |
+----------+------------------+------+-----+---------+-------+
| id       | int              | NO   | PRI | <null>  |       |
| username | varchar(20)      | NO   | PRI | <null>  |       |
+----------+------------------+------+-----+---------+-------+

注意: 當使用聯合主鍵約束的時候,必須顯示地用 CONSTRAINT 指定 user_pk 是聯合主鍵。

6. UNIQUE

UNIQUE,用於唯一標識資料表中的每一條記錄。

UNIQUE 約束的欄位必須是唯一的,即該欄位在每條記錄中必須各不相同。PRIMARY KEY 約束預設擁有 UNIQUE 約束。

每個表可以有多個UNIQUE約束,但是隻能有一個PRIMARY KEY

6.1 例3 新建imooc_user表3

請書寫 SQL 語句,新建imooc_user表,表共有2欄位,分別是usernameage,其中username為非空欄位,且唯一。

分析

username 代表使用者名稱,使用字串表示,且每個人的使用者名稱長短不一,為可變短文字,即 varchar,該欄位非空,用 NOT NULL 約束,且該欄位唯一,使用 UNIQUE 約束。

語句

整理可得語句如下:

CREATE TABLE imooc_user
(
  username varchar(20) UNIQUE NOT NULL,
  age int
);

執行成功後,表的資訊如下:

+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| username | varchar(20) | NO   | PRI | <null>  |       |
| age      | int(11)     | YES  |     | <null>  |       |
+----------+-------------+------+-----+---------+-------+

UNIQUE 也可用於約束多個欄位,即聯合唯一鍵

修改上面的例子,若 imooc_user 表中的usernameage為聯合唯一欄位,語句如下:

CREATE TABLE imooc_user
(
  username varchar(20) NOT NULL,
  age int,
  CONSTRAINT username_age UNIQUE(username,age)
);

建立成功後,imooc_user 表資訊如下:

+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| username | varchar(20) | NO   | MUL | <null>  |       |
| age      | int(11)     | YES  |     | <null>  |       |
+----------+-------------+------+-----+---------+-------+

7. 小結

  • PRIMARY KEY 、UNIQUE 和 NOT NULL 這些約束的使用都十分普遍,請務必熟練掌握。
  • SQL Create 的知識點還是較多的,兩節的內容無法是不夠的,你可以在實踐中進一步加強對它的理解。