一埠帕、什么是主鍵
主鍵(PRIMARY KEY)的又叫做“主鍵約束”媳瞪,MySQL 主鍵約束是一個單獨的列或者多個列的組合抑片,其值能唯一地標識表中的一行數(shù)據(jù)睹栖。這樣的一列或多列稱為表的主鍵硫惕,通過它可以強制表的實體完整性。
例如野来,通過某個人的身份證號碼可以唯一確定唯一一個人恼除,那這個身份證號就是主鍵。如果通過身份證號找到兩個人曼氛,但是兩個人的姓名不一樣豁辉。則通過”身份證號+姓名”可以確定唯一一個人,則”身份證號+姓名”的組合就是主鍵舀患。
二徽级、選取設置主鍵約束的字段
單獨一個列的主鍵可以叫做單列主鍵,或者就叫為主鍵聊浅。由多個列組合的主鍵稱為復合主鍵餐抢,例如”身份證號+姓名”確定唯一一條數(shù)據(jù)的情況就屬于一種復核主鍵。
主鍵應該遵守下面的規(guī)則:
每個表只能定義一個主鍵低匙。
遵循唯一性原則旷痕,主鍵值必須唯一標識表中的每一行數(shù)據(jù),且不能為 NULL顽冶,即表中不可能存在兩行數(shù)據(jù)有相同的主鍵值欺抗。
一個列名只能在復合主鍵列表中出現(xiàn)一次。例如“身份證+姓名”為主鍵强重,而不能是”身份證+身份證+姓名”為主鍵绞呈。
遵循最小化原則贸人,復合主鍵不能包含不必要的多余列,當把復合主鍵的某一列刪除后报强,如果剩下的列構(gòu)成的主鍵仍然滿足唯一性原則灸姊,那么這個復合主鍵是不正確的。這是最小化原則秉溉。
三力惯、重要注意事項
如果在建表的時候沒有主動設置主鍵,就會選一個不包含NULL的第一個唯一索引列作為主鍵列召嘶,并把它用作一個聚集索引(也叫聚簇索引)父晶。
如果沒有這樣的索引就會使用行號生成一個聚集索引(也叫聚簇索引),把它當做主鍵弄跌,這個行號長度為6 bytes甲喝,自增☆踔唬可以用select _rowid from table語句來查詢埠胖。
墻裂建議:每一個表都要明確設置主鍵,不要使用系統(tǒng)自動生成的主鍵淳玩,完全對系統(tǒng)開發(fā)沒有一點好處直撤,應該把這條規(guī)則作為強制開發(fā)約束。
四蜕着、設置主鍵的方法
- 第一種方法:在創(chuàng)建表時設置主鍵約束谋竖,在 CREATE TABLE 語句中,通過 PRIMARY KEY 關(guān)鍵字來指定承匣,在定義列的同時指定主鍵蓖乘,語法規(guī)則為:列名 列類型 PRIMARY KEY [默認值]
示例1,在 demo_db 數(shù)據(jù)庫中創(chuàng)建 demo_employee 3 數(shù)據(jù)表韧骗,其主鍵為 id嘉抒,測試SQL語句和執(zhí)行結(jié)果如下所示。
mysql> CREATE TABLE demo_employee3
-> (
-> id INT(11) PRIMARY KEY,
-> name VARCHAR(25),
-> deptid INT(11),
-> salary FLOAT
-> );
Query OK, 0 rows affected (0.37 sec)
mysql> DESC demo_employee3;
+--------+-------------+------+-----+---------+-------+
| 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众眨,在 demo_db 數(shù)據(jù)庫中創(chuàng)建 demo_employee 4 數(shù)據(jù)表,其主鍵為 id容诬,測試SQL語句和執(zhí)行結(jié)果如下所示娩梨。
mysql> CREATE TABLE demo_employee4
-> (
-> id INT(11),
-> name VARCHAR(25),
-> deptid INT(11),
-> salary FLOAT,
-> PRIMARY KEY(id)
-> );
Query OK, 0 rows affected (0.37 sec)
mysql> DESC demo_employee4;
+--------+-------------+------+-----+---------+-------+
| 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)
主鍵由多個字段聯(lián)合組成,語法規(guī)則如下:PRIMARY KEY [字段1览徒,字段2狈定,…,字段n]
示例3,創(chuàng)建數(shù)據(jù)表 demo_employee5,假設表中沒有主鍵 id纽什,為了唯一確定一個員工措嵌,可以把 name、deptid 聯(lián)合起來作為主鍵芦缰,測試SQL語句和執(zhí)行結(jié)果如下所示企巢。
mysql> CREATE TABLE demo_employee5
-> (
-> name VARCHAR(25),
-> deptid INT(11),
-> salary FLOAT,
-> PRIMARY KEY(name,deptid)
-> );
Query OK, 0 rows affected (0.37 sec)
mysql> DESC demo_employee5;
+--------+-------------+------+-----+---------+-------+
| 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)
- 在修改表時添加主鍵約束,語法規(guī)則為:ALTER TABLE <表名> ADD PRIMARY KEY(<列名>);
示例4让蕾,修改數(shù)據(jù)表 demo_employee2浪规,將字段 id 設置為主鍵,測試SQL語句和執(zhí)行結(jié)果如下所示探孝。
首先查看 demo_employee2 數(shù)據(jù)表的表結(jié)構(gòu)笋婿,如下所示,是沒有設置任何主鍵的顿颅。
mysql> DESC demo_employee2;
+--------+-------------+------+-----+---------+-------+
| 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)
然后使用ALTER語句修改表缸濒,同時增加主鍵
mysql> ALTER TABLE demo_employee2
-> ADD PRIMARY KEY(id);
Query OK, 0 rows affected (0.94 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> DESC demo_employee2;
+--------+-------------+------+-----+---------+-------+
| 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是日常工作中使用最對的數(shù)據(jù)庫之一,所以必須要要較為深入和全面的掌握粱腻,對于高階人員還要掌握分布式事務庇配、各種數(shù)據(jù)庫鎖、傳播機制等绍些。