“主鍵(PRIMARY KEY)”的完整稱呼是“主鍵限制”。MySQL 主鍵限制是一個列或者列的組合,其值能唯一地辨別表中的每一行。這樣的一列或多列稱為表的主鍵,通過它可以強制表的實體完整性。
選取設定主鍵限制的字段
主鍵限制即在表中定義一個主鍵來唯一确定表中每一行資料的辨別符。主鍵可以是表中的某一列或者多列的組合,其中由多列組合的主鍵稱為複合主鍵。主鍵應該遵守下面的規則:
每個表隻能定義一個主鍵。
主鍵值必須唯一辨別表中的每一行,且不能為 NULL,即表中不可能存在兩行資料有相同的主鍵值。這是唯一性原則。
一個列名隻能在複合主鍵清單中出現一次。
複合主鍵不能包含不必要的多餘列。當把複合主鍵的某一列删除後,如果剩下的列構成的主鍵仍然滿足唯一性原則,那麼這個複合主鍵是不正确的。這是最小化原則。
在建立表時設定主鍵限制
在 CREATE TABLE 語句中,主鍵是通過 PRIMARY KEY 關鍵字來指定的。
在定義列的同時指定主鍵,文法規則如下:
PRIMARY KEY [預設值]
【執行個體 1】在 test_db 資料庫中建立 tb_emp 3 資料表,其主鍵為 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_emp 4 資料表,其主鍵為 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)
在建立表時設定複合主鍵
主鍵由多個字段聯合組成,文法規則如下:
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 資料表的表結構,如下所示。
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)