mysql中可以通過在“CREATE table”語句中,使用“ PRIMARY KEY [默認值]”語句來設置主鍵約束,使用“ NOT NULL”語句來設置非空約束。
mysql主鍵約束
主鍵(PRIMARY KEY)的完整稱呼是“主鍵約束”,是?MySQL?中使用最為頻繁的約束。一般情況下,為了便于 DBMS 更快的查找到表中的記錄,都會在表中設置一個主鍵。
使用主鍵應注意以下幾點:
-
每個表只能定義一個主鍵。
-
主鍵值必須唯一標識表中的每一行,且不能為 NULL,即表中不可能存在有相同主鍵值的兩行數據。這是唯一性原則。
-
一個字段名只能在聯合主鍵字段表中出現一次。
-
聯合主鍵不能包含不必要的多余字段。當把聯合主鍵的某一字段刪除后,如果剩下的字段構成的主鍵仍然滿足唯一性原則,那么這個聯合主鍵是不正確的。這是最小化原則。
在創建表時設置主鍵約束
在創建數據表時設置主鍵約束,既可以為表中的一個字段設置主鍵,也可以為表中多個字段設置聯合主鍵。但是不論使用哪種方法,在一個表中主鍵只能有一個。下面分別講解設置單字段主鍵和多字段聯合主鍵的方法。
1)設置單字段主鍵
在 CREATE TABLE 語句中,通過 PRIMARY KEY 關鍵字來指定主鍵。
在定義字段的同時指定主鍵,語法格式如下:
??PRIMARY?KEY?[默認值]
例 1
在 test_db 數據庫中創建 tb_emp3 數據表,其主鍵為 id,SQL 語句和運行結果如下。
mysql>?CREATE?TABLE?tb_emp3 ????->?( ????->?id?INT(11)?PRIMARY?KEY, ????->?name?VARCHAR(25), ????->?deptId?INT(11), ????->?salary?FLOAT ????->?); Query?OK,?0?rows?affected?(0.37?sec) mysql>?DESC?tb_emp3; +--------+-------------+------+-----+---------+-------+ |?Field??|?Type????????|?Null?|?Key?|?Default?|?Extra?| +--------+-------------+------+-----+---------+-------+ |?id?????|?int(11)?????|?NO???|?PRI?|?NULL????|???????| |?name???|?varchar(25)?|?YES??|?????|?NULL????|???????| |?deptId?|?int(11)?????|?YES??|?????|?NULL????|???????| |?salary?|?float???????|?YES??|?????|?NULL????|???????| +--------+-------------+------+-----+---------+-------+ 4?rows?in?set?(0.14?sec)
或者是在定義完所有字段之后指定主鍵,語法格式如下:
[CONSTRAINT?]?PRIMARY?KEY?[字段名]
例 2
在 test_db 數據庫中創建 tb_emp4? 數據表,其主鍵為 id,SQL 語句和運行結果如下。
mysql>?CREATE?TABLE?tb_emp4 ????->?( ????->?id?INT(11), ????->?name?VARCHAR(25), ????->?deptId?INT(11), ????->?salary?FLOAT, ????->?PRIMARY?KEY(id) ????->?); Query?OK,?0?rows?affected?(0.37?sec) mysql>?DESC?tb_emp4; +--------+-------------+------+-----+---------+-------+ |?Field??|?Type????????|?Null?|?Key?|?Default?|?Extra?| +--------+-------------+------+-----+---------+-------+ |?id?????|?int(11)?????|?NO???|?PRI?|?NULL????|???????| |?name???|?varchar(25)?|?YES??|?????|?NULL????|???????| |?deptId?|?int(11)?????|?YES??|?????|?NULL????|???????| |?salary?|?float???????|?YES??|?????|?NULL????|???????| +--------+-------------+------+-----+---------+-------+ 4?rows?in?set?(0.14?sec)
2)在創建表時設置聯合主鍵
所謂的聯合主鍵,就是這個主鍵是由一張表中多個字段組成的。
比如,設置學生選課數據表時,使用學生編號做主鍵還是用課程編號做主鍵呢?如果用學生編號做主鍵,那么一個學生就只能選擇一門課程。如果用課程編號做主鍵,那么一門課程只能有一個學生來選。顯然,這兩種情況都是不符合實際情況的。
實際上設計學生選課表,要限定的是一個學生只能選擇同一課程一次。因此,學生編號和課程編號可以放在一起共同作為主鍵,這也就是聯合主鍵了。
主鍵由多個字段聯合組成,語法格式如下:
PRIMARY?KEY?[字段1,字段2,…,字段n]
注意:當主鍵是由多個字段組成時,不能直接在字段名后面聲明主鍵約束。
例 3
創建數據表 tb_emp5,假設表中沒有主鍵 id,為了唯一確定一個員工,可以把 name、deptId 聯合起來作為主鍵,SQL 語句和運行結果如下。
mysql>?CREATE?TABLE?tb_emp5 ????->?( ????->?name?VARCHAR(25), ????->?deptId?INT(11), ????->?salary?FLOAT, ????->?PRIMARY?KEY(id,deptId) ????->?); Query?OK,?0?rows?affected?(0.37?sec) mysql>?DESC?tb_emp5; +--------+-------------+------+-----+---------+-------+ |?Field??|?Type????????|?Null?|?Key?|?Default?|?Extra?| +--------+-------------+------+-----+---------+-------+ |?name???|?varchar(25)?|?NO???|?PRI?|?NULL????|???????| |?deptId?|?int(11)?????|?NO???|?PRI?|?NULL????|???????| |?salary?|?float???????|?YES??|?????|?NULL????|???????| +--------+-------------+------+-----+---------+-------+ 3?rows?in?set?(0.14?sec)
在修改表時添加主鍵約束
主鍵約束不僅可以在創建表的同時創建,也可以在修改表時添加。但是需要注意的是,設置成主鍵約束的字段中不允許有空值。
在修改數據表時添加主鍵約束的語法格式如下:
ALTER?TABLE??ADD?PRIMARY?KEY();
查看 tb_emp2 數據表的表結構,SQL 語句和運行結果如下所示。
mysql>?DESC?tb_emp2; +--------+-------------+------+-----+---------+-------+ |?Field??|?Type????????|?Null?|?Key?|?Default?|?Extra?| +--------+-------------+------+-----+---------+-------+ |?id?????|?int(11)?????|?NO???|?????|?NULL????|???????| |?name???|?varchar(30)?|?YES??|?????|?NULL????|???????| |?deptId?|?int(11)?????|?YES??|?????|?NULL????|???????| |?salary?|?float???????|?YES??|?????|?NULL????|???????| +--------+-------------+------+-----+---------+-------+ 4?rows?in?set?(0.14?sec)
例 4
修改數據表 tb_emp2,將字段 id 設置為主鍵,SQL 語句和運行結果如下。
mysql>?ALTER?TABLE?tb_emp2 ????->?ADD?PRIMARY?KEY(id); Query?OK,?0?rows?affected?(0.94?sec) Records:?0??Duplicates:?0??Warnings:?0 mysql>?DESC?tb_emp2; +--------+-------------+------+-----+---------+-------+ |?Field??|?Type????????|?Null?|?Key?|?Default?|?Extra?| +--------+-------------+------+-----+---------+-------+ |?id?????|?int(11)?????|?NO???|?PRI?|?NULL????|???????| |?name???|?varchar(30)?|?YES??|?????|?NULL????|???????| |?deptId?|?int(11)?????|?YES??|?????|?NULL????|???????| |?salary?|?float???????|?YES??|?????|?NULL????|???????| +--------+-------------+------+-----+---------+-------+ 4?rows?in?set?(0.12?sec)
通常情況下,當在修改表時要設置表中某個字段的主鍵約束時,要確保設置成主鍵約束的字段中值不能夠有重復的,并且要保證是非空的。否則,無法設置主鍵約束。
mysql非空約束
MySQL?非空約束(NOT NULL)指字段的值不能為空。對于使用了非空約束的字段,如果用戶在添加數據時沒有指定值,數據庫系統就會報錯。可以通過 CREATE TABLE 或 ALTER TABLE 語句實現。在表中某個列的定義后加上關鍵字 NOT NULL 作為限定詞,來約束該列的取值不能為空。
比如,在用戶信息表中,如果不添加用戶名,那么這條用戶信息就是無效的,這時就可以為用戶名字段設置非空約束。
在創建表時設置非空約束
創建表時可以使用 NOT NULL 關鍵字設置非空約束,具體的語法格式如下:
??NOT?NULL
例 1
創建數據表 tb_dept4,指定部門名稱不能為空,SQL 語句和運行結果如下所示。
mysql>?CREATE?TABLE?tb_dept4 ????->?( ????->?id?INT(11)?PRIMARY?KEY, ????->?name?VARCHAR(22)?NOT?NULL, ????->?location?VARCHAR(50) ????->?); Query?OK,?0?rows?affected?(0.37?sec) mysql>?DESC?tb_dept3; +----------+-------------+------+-----+---------+-------+ |?Field????|?Type????????|?Null?|?Key?|?Default?|?Extra?| +----------+-------------+------+-----+---------+-------+ |?id???????|?int(11)?????|?NO???|?PRI?|?NULL????|???????| |?name?????|?varchar(22)?|?NO???|?????|?NULL????|???????| |?location?|?varchar(50)?|?YES??|?????|?NULL????|???????| +----------+-------------+------+-----+---------+-------+ 3?rows?in?set?(0.06?sec)
在修改表時添加非空約束
如果在創建表時忘記了為字段設置非空約束,也可以通過修改表進行非空約束的添加。
修改表時設置非空約束的語法格式如下:
ALTER?TABLE? CHANGE?COLUMN? ??NOT?NULL;
例 2
修改數據表 tb_dept4,指定部門位置不能為空,SQL 語句和運行結果如下所示。
mysql>?ALTER?TABLE?tb_dept4 ????->?CHANGE?COLUMN?location ????->?location?VARCHAR(50)?NOT?NULL; Query?OK,?0?rows?affected?(0.15?sec) Records:?0??Duplicates:?0??Warnings:?0 mysql>?DESC?tb_dept4; +----------+-------------+------+-----+----------+-------+ |?Field????|?Type????????|?Null?|?Key?|?Default??|?Extra?| +----------+-------------+------+-----+----------+-------+ |?id???????|?int(11)?????|?NO???|?PRI?|?NULL?????|???????| |?name?????|?varchar(22)?|?NO???|?????|?NULL?????|???????| |?location?|?varchar(50)?|?NO???|?????|?NULL?????|???????| +----------+-------------+------+-----+----------+-------+ 3?rows?in?set?(0.00?sec)
推薦教程:mysql視頻教程