mysql中主鍵不是索引。主鍵全名為“主鍵約束”,是對錶中資料的一種約束,它是表的一個特殊字段,該字段能唯一標識該表中的每條信息;而索引是一種特殊的數據庫結構,由數據表中的一列或多列組合而成,可以用來快速查詢資料表中有某一特定值的記錄。
本教學操作環境:windows7系統、mysql8版本、Dell G3電腦。
在 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(name,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)
通常情況下,當在修改表時要設定表中某個欄位的主鍵約束時,要確保設定成主鍵約束的欄位中值不能夠有重複的,並且要保證是非空的。否則,無法設定主鍵約束。
#索引是一種特殊的資料庫結構,由資料表中的一列或多列組合而成,可以用來快速查詢資料表中有某一特定值的記錄。
透過索引,查詢資料時不用讀完記錄的所有信息,而只是查詢索引列。否則,資料庫系統將讀取每筆記錄的所有資訊進行比對。
可以把索引比喻為新華字典的音序表。例如,要查「庫」字,如果不使用音序,就需要從字典的 400 頁中逐頁來找。但是,如果提取拼音出來,構成音序表,就只需要從 10 多頁的音序表中直接找到。這樣就可以大大節省時間。
索引的優缺點
索引有其明顯的優勢,也有其不可避免的缺點。
優點
索引的優點如下:
透過建立唯一索引可以保證資料庫表中每一行資料的唯一性。
可以為所有的 MySQL 欄位類型設定索引。
可以大幅加快資料的查詢速度,這是使用索引最主要的原因。
在實現資料的參考完整性方面可以加速表與表之間的連接。
在使用分組和排序子句進行資料查詢時也可以顯著減少查詢中分組和排序的時間
缺點
增加索引也有許多不利的方面,主要如下:
建立和維護索引組要耗費時間,並且隨著資料量的增加所耗費的時間也會增加。
索引需要佔磁碟空間,除了資料表佔資料空間以外,每個索引還要佔一定的實體空間。如果有大量的索引,索引檔案可能比資料檔案更快達到最大檔案尺寸。
當資料表中的資料增加、刪除和修改的時候,索引也要動態維護,這樣就降低了資料的維護速度。
使用索引時,需要綜合考慮索引的優點和缺點。
索引可以提高查詢速度,但會影響插入記錄的速度。因為,在有索引的表中插入記錄時,資料庫系統會依照索引進行排序,這樣就降低了插入記錄的速度,插入大量記錄時的速度影響會更加明顯。在這種情況下,最好的方法是先刪除表中的索引,然後插入數據,插入完成後,再建立索引。
【相關推薦:mysql影片教學】
#以上是mysql中主鍵是索引嗎的詳細內容。更多資訊請關注PHP中文網其他相關文章!