站長(zhǎng)資訊網(wǎng)
        最全最豐富的資訊網(wǎng)站

        mysql中主鍵是索引嗎

        mysql中主鍵不是索引。主鍵全稱(chēng)“主鍵約束”,是對(duì)表中數(shù)據(jù)的一種約束,它是表的一個(gè)特殊字段,該字段能唯一標(biāo)識(shí)該表中的每條信息;而索引是一種特殊的數(shù)據(jù)庫(kù)結(jié)構(gòu),由數(shù)據(jù)表中的一列或多列組合而成,可以用來(lái)快速查詢(xún)數(shù)據(jù)表中有某一特定值的記錄。

        mysql中主鍵是索引嗎

        本教程操作環(huán)境:windows7系統(tǒng)、mysql8版本、Dell G3電腦。

        MySQL 主鍵

        在 MySQL 中,主鍵(PRIMARY KEY)的完整稱(chēng)呼是“主鍵約束”,是 MySQL 中使用最為頻繁的約束。一般情況下,為了便于 DBMS 更快的查找到表中的記錄,都會(huì)在表中設(shè)置一個(gè)主鍵。

        約束是指對(duì)表中數(shù)據(jù)的一種約束,能夠幫助數(shù)據(jù)庫(kù)管理員更好地管理數(shù)據(jù)庫(kù),并且能夠確保數(shù)據(jù)庫(kù)中數(shù)據(jù)的正確性和有效性。

        主鍵是表的一個(gè)特殊字段,該字段能唯一標(biāo)識(shí)該表中的每條信息。例如,學(xué)生信息表中的學(xué)號(hào)是唯一的。

        主鍵分為單字段主鍵和多字段聯(lián)合主鍵,本節(jié)將分別講解這兩種主鍵約束的創(chuàng)建、修改和刪除。

        使用主鍵應(yīng)注意以下幾點(diǎn):

        • 每個(gè)表只能定義一個(gè)主鍵。

        • 主鍵值必須唯一標(biāo)識(shí)表中的每一行,且不能為 NULL,即表中不可能存在有相同主鍵值的兩行數(shù)據(jù)。這是唯一性原則。

        • 一個(gè)字段名只能在聯(lián)合主鍵字段表中出現(xiàn)一次。

        • 聯(lián)合主鍵不能包含不必要的多余字段。當(dāng)把聯(lián)合主鍵的某一字段刪除后,如果剩下的字段構(gòu)成的主鍵仍然滿(mǎn)足唯一性原則,那么這個(gè)聯(lián)合主鍵是不正確的。這是最小化原則。

        在創(chuàng)建表時(shí)設(shè)置主鍵約束

        在創(chuàng)建數(shù)據(jù)表時(shí)設(shè)置主鍵約束,既可以為表中的一個(gè)字段設(shè)置主鍵,也可以為表中多個(gè)字段設(shè)置聯(lián)合主鍵。但是不論使用哪種方法,在一個(gè)表中主鍵只能有一個(gè)。下面分別講解設(shè)置單字段主鍵和多字段聯(lián)合主鍵的方法。

        1)設(shè)置單字段主鍵

        在 CREATE TABLE 語(yǔ)句中,通過(guò) PRIMARY KEY 關(guān)鍵字來(lái)指定主鍵。

        在定義字段的同時(shí)指定主鍵,語(yǔ)法格式如下:

        <字段名> <數(shù)據(jù)類(lèi)型> PRIMARY KEY [默認(rèn)值]

        例 1

        在 test_db 數(shù)據(jù)庫(kù)中創(chuàng)建 tb_emp3 數(shù)據(jù)表,其主鍵為 id,SQL 語(yǔ)句和運(yùn)行結(jié)果如下。

        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)

        或者是在定義完所有字段之后指定主鍵,語(yǔ)法格式如下:

        [CONSTRAINT <約束名>] PRIMARY KEY [字段名]

        例 2

        在 test_db 數(shù)據(jù)庫(kù)中創(chuàng)建 tb_emp4 數(shù)據(jù)表,其主鍵為 id,SQL 語(yǔ)句和運(yùn)行結(jié)果如下。

        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)在創(chuàng)建表時(shí)設(shè)置聯(lián)合主鍵

        所謂的聯(lián)合主鍵,就是這個(gè)主鍵是由一張表中多個(gè)字段組成的。

        比如,設(shè)置學(xué)生選課數(shù)據(jù)表時(shí),使用學(xué)生編號(hào)做主鍵還是用課程編號(hào)做主鍵呢?如果用學(xué)生編號(hào)做主鍵,那么一個(gè)學(xué)生就只能選擇一門(mén)課程。如果用課程編號(hào)做主鍵,那么一門(mén)課程只能有一個(gè)學(xué)生來(lái)選。顯然,這兩種情況都是不符合實(shí)際情況的。

        實(shí)際上設(shè)計(jì)學(xué)生選課表,要限定的是一個(gè)學(xué)生只能選擇同一課程一次。因此,學(xué)生編號(hào)和課程編號(hào)可以放在一起共同作為主鍵,這也就是聯(lián)合主鍵了。

        主鍵由多個(gè)字段聯(lián)合組成,語(yǔ)法格式如下:

        PRIMARY KEY [字段1,字段2,…,字段n]

        注意:當(dāng)主鍵是由多個(gè)字段組成時(shí),不能直接在字段名后面聲明主鍵約束。

        例 3

        創(chuàng)建數(shù)據(jù)表 tb_emp5,假設(shè)表中沒(méi)有主鍵 id,為了唯一確定一個(gè)員工,可以把 name、deptId 聯(lián)合起來(lái)作為主鍵,SQL 語(yǔ)句和運(yùn)行結(jié)果如下。

        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)

        在修改表時(shí)添加主鍵約束

        主鍵約束不僅可以在創(chuàng)建表的同時(shí)創(chuàng)建,也可以在修改表時(shí)添加。但是需要注意的是,設(shè)置成主鍵約束的字段中不允許有空值。

        在修改數(shù)據(jù)表時(shí)添加主鍵約束的語(yǔ)法格式如下:

        ALTER TABLE <數(shù)據(jù)表名> ADD PRIMARY KEY(<字段名>);

        查看 tb_emp2 數(shù)據(jù)表的表結(jié)構(gòu),SQL 語(yǔ)句和運(yùn)行結(jié)果如下所示。

        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

        修改數(shù)據(jù)表 tb_emp2,將字段 id 設(shè)置為主鍵,SQL 語(yǔ)句和運(yùn)行結(jié)果如下。

        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)

        通常情況下,當(dāng)在修改表時(shí)要設(shè)置表中某個(gè)字段的主鍵約束時(shí),要確保設(shè)置成主鍵約束的字段中值不能夠有重復(fù)的,并且要保證是非空的。否則,無(wú)法設(shè)置主鍵約束。

        MySQL 索引(Index)

        索引是一種特殊的數(shù)據(jù)庫(kù)結(jié)構(gòu),由數(shù)據(jù)表中的一列或多列組合而成,可以用來(lái)快速查詢(xún)數(shù)據(jù)表中有某一特定值的記錄。

        通過(guò)索引,查詢(xún)數(shù)據(jù)時(shí)不用讀完記錄的所有信息,而只是查詢(xún)索引列。否則,數(shù)據(jù)庫(kù)系統(tǒng)將讀取每條記錄的所有信息進(jìn)行匹配。

        可以把索引比作新華字典的音序表。例如,要查“庫(kù)”字,如果不使用音序,就需要從字典的 400 頁(yè)中逐頁(yè)來(lái)找。但是,如果提取拼音出來(lái),構(gòu)成音序表,就只需要從 10 多頁(yè)的音序表中直接查找。這樣就可以大大節(jié)省時(shí)間。

        索引的優(yōu)缺點(diǎn)

        索引有其明顯的優(yōu)勢(shì),也有其不可避免的缺點(diǎn)。

        優(yōu)點(diǎn)

        索引的優(yōu)點(diǎn)如下:

        • 通過(guò)創(chuàng)建唯一索引可以保證數(shù)據(jù)庫(kù)表中每一行數(shù)據(jù)的唯一性。

        • 可以給所有的 MySQL 列類(lèi)型設(shè)置索引。

        • 可以大大加快數(shù)據(jù)的查詢(xún)速度,這是使用索引最主要的原因。

        • 在實(shí)現(xiàn)數(shù)據(jù)的參考完整性方面可以加速表與表之間的連接。

        • 在使用分組和排序子句進(jìn)行數(shù)據(jù)查詢(xún)時(shí)也可以顯著減少查詢(xún)中分組和排序的時(shí)間

        缺點(diǎn)

        增加索引也有許多不利的方面,主要如下:

        • 創(chuàng)建和維護(hù)索引組要耗費(fèi)時(shí)間,并且隨著數(shù)據(jù)量的增加所耗費(fèi)的時(shí)間也會(huì)增加。

        • 索引需要占磁盤(pán)空間,除了數(shù)據(jù)表占數(shù)據(jù)空間以外,每一個(gè)索引還要占一定的物理空間。如果有大量的索引,索引文件可能比數(shù)據(jù)文件更快達(dá)到最大文件尺寸。

        • 當(dāng)對(duì)表中的數(shù)據(jù)進(jìn)行增加、刪除和修改的時(shí)候,索引也要?jiǎng)討B(tài)維護(hù),這樣就降低了數(shù)據(jù)的維護(hù)速度。

        使用索引時(shí),需要綜合考慮索引的優(yōu)點(diǎn)和缺點(diǎn)。

        索引可以提高查詢(xún)速度,但是會(huì)影響插入記錄的速度。因?yàn)椋蛴兴饕谋碇胁迦胗涗洉r(shí),數(shù)據(jù)庫(kù)系統(tǒng)會(huì)按照索引進(jìn)行排序,這樣就降低了插入記錄的速度,插入大量記錄時(shí)的速度影響會(huì)更加明顯。這種情況下,最好的辦法是先刪除表中的索引,然后插入數(shù)據(jù),插入完成后,再創(chuàng)建索引。

        贊(0)
        分享到: 更多 (0)
        網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
        主站蜘蛛池模板: 精品无码人妻一区二区三区| 日韩欧国产精品一区综合无码 | 1区1区3区4区产品芒果精品| 一本久久a久久精品综合香蕉| 国产99久久久国产精品~~牛| 国产三级久久久精品麻豆三级| 香蕉99久久国产综合精品宅男自| 91国内揄拍国内精品对白不卡| 999国内精品永久免费观看| 综合久久精品色| 久久青青草原精品国产软件| 刺激无码在线观看精品视频| 国产伦精品一区二区三区女 | 国产精品嫩草影院AV| 亚洲国产另类久久久精品| 久久99精品九九九久久婷婷| 国产精品爱搞视频网站| 久久夜色精品国产亚洲| 国产精品久久久久久吹潮| 人妻熟妇乱又伦精品视频| 亚洲精品无码专区2| 亚洲AV成人精品日韩一区18p| 久久精品无码一区二区三区日韩| 国产精品亚洲美女久久久| 四虎影视884a精品国产四虎| 久久精品国产精品国产精品污| 91麻豆国产福利精品 | 日本精品夜色视频一区二区| 大胸国产精品视频| 国产VA免费精品高清在线| 99riav国产精品| 国产L精品国产亚洲区久久| 国产精品99在线播放| 国产成人AV无码精品| 黑巨人与欧美精品一区| 精品亚洲欧美无人区乱码| 久久国产精品一区| 青春草无码精品视频在线观| 亚洲国产精品成人午夜在线观看| 色偷偷88欧美精品久久久| 亚洲福利精品电影在线观看|