- MySQL入門很輕松(微課超值版)
- 云尚科技
- 1898字
- 2020-09-18 11:30:49
5.2 主鍵約束

主鍵,又稱主碼,是表中一列或多列的組合。主鍵約束(Primary Key Constraint)要求主鍵列的數(shù)據(jù)唯一,并且不允許為空。主鍵和記錄之間的關(guān)系如同身份證和人之間的關(guān)系,它們之間是一一對應(yīng)的。主鍵分為兩種類型:單字段和多字段聯(lián)合主鍵。
5.2.1 創(chuàng)建表時添加主鍵
如果主鍵包含一個字段,則所有記錄的該字段值不能相同或?yàn)榭罩担蝗绻麈I包含多個字段,則所有記錄的該字段值的組合不能相同,而單個字段值可以相同,一個表中只能有一個主鍵,也就是說只能有一個PRIMARY KEY約束。
注意:數(shù)據(jù)類型為IMAGE和TEXT的字段列不能定義為主鍵。
創(chuàng)建表時創(chuàng)建主鍵的方法是在數(shù)據(jù)列的后面直接添加關(guān)鍵字PRIMARY KEY,語法格式如下:
字段名 數(shù)據(jù)類型 PRIMARY KEY
主要參數(shù)介紹如下。
- 字段名:表示要添加主鍵約束的字段。
- 數(shù)據(jù)類型:表示字段的數(shù)據(jù)類型。
- PRIMARY KEY:表示所添加約束的類型為主鍵約束。
【實(shí)例1】假如,要在酒店客戶管理系統(tǒng)的數(shù)據(jù)庫Hotel中創(chuàng)建一個數(shù)據(jù)表,用于保存房間信息,并給房間編號添加主鍵約束,表的字段名和數(shù)據(jù)類型如表5-1所示。
表5-1 房間信息表

在Hotel數(shù)據(jù)庫中定義數(shù)據(jù)表Roominfo,為Roomid創(chuàng)建主鍵約束。輸入以下SQL語句:

單擊“執(zhí)行”按鈕,即可完成創(chuàng)建數(shù)據(jù)表時添加主鍵的操作,如圖5-1所示。
執(zhí)行完成之后,使用“DESC Roominfo;”語句查看表結(jié)構(gòu),執(zhí)行結(jié)果如圖5-2所示。從結(jié)果可以看出Roominfo數(shù)據(jù)表中Roomid的Key屬性的值為PRI,這就說明Roomid字段為當(dāng)前數(shù)據(jù)表的主鍵,添加主鍵成功。

圖5-1 執(zhí)行SQL語句

圖5-2 表設(shè)計(jì)結(jié)構(gòu)
除了在定義字段列時添加主鍵外,還可以在定義完所有字段列之后添加主鍵,語法格式如下:
[CONSTRAINT<約束名>] PRIMARY KEY [字段名]
主要參數(shù)介紹如下。
- CONSTRAINT:創(chuàng)建約束的關(guān)鍵字。
- 約束名:設(shè)置主鍵約束的名稱。
- PRIMARY KEY:表示所添加約束的類型為主鍵約束。
- 字段名:表示要添加主鍵約束的字段。
【實(shí)例2】在Hotel數(shù)據(jù)庫中定義數(shù)據(jù)表Roominfo_01,為Roomid創(chuàng)建主鍵約束。輸入以下SQL語句:

單擊“執(zhí)行”按鈕,即可完成創(chuàng)建數(shù)據(jù)表并在定義完所有字段列之后添加主鍵的操作,如圖5-3所示。
執(zhí)行完成之后,使用“DESC Roominfo_01;”語句查看表結(jié)構(gòu),執(zhí)行結(jié)果如圖5-4所示。從結(jié)果可以看出這兩種添加主鍵的方式一樣,都會在Roomid字段上設(shè)置主鍵約束。

圖5-3 創(chuàng)建表時添加主鍵

圖5-4 查看表的設(shè)計(jì)結(jié)構(gòu)
5.2.2 修改表時添加主鍵
數(shù)據(jù)表創(chuàng)建完成后,如果還需要為數(shù)據(jù)表創(chuàng)建主鍵約束,此時不需要再重新創(chuàng)建數(shù)據(jù)表。可以使用Alter語句為現(xiàn)有表添加主鍵。使用ALTER語句在現(xiàn)有數(shù)據(jù)表中創(chuàng)建主鍵,語法格式如下:
ALTER TABLE table_name ADD CONSTRAINT 約束名 PRIMARY KEY (column_name1, column_name2,…)
主要參數(shù)介紹如下。
- CONSTRAINT:創(chuàng)建約束的關(guān)鍵字。
- 約束名:設(shè)置主鍵約束的名稱。
- PRIMARY KEY:表示所添加約束的類型為主鍵約束。
【實(shí)例3】在Hotel數(shù)據(jù)庫中定義數(shù)據(jù)表Roominfo_02,創(chuàng)建完成之后,在該表中的Roomid字段上創(chuàng)建主鍵約束。輸入以下SQL語句:

單擊“執(zhí)行”按鈕,即可完成創(chuàng)建數(shù)據(jù)表操作,如圖5-5所示。執(zhí)行完成之后,使用“DESC Roominfo_02;”語句查看表結(jié)構(gòu),執(zhí)行結(jié)果如圖5-6所示。從結(jié)果可以看出Roomid字段上并未設(shè)置主鍵約束。

圖5-5 創(chuàng)建數(shù)據(jù)表Roominfo_02

圖5-6 Roominfo_02表結(jié)構(gòu)
下面給Roomid字段添加主鍵,輸入SQL語句:
ALTER TABLE Roominfo_02 ADD CONSTRAINT 編號 PRIMARY KEY(Roomid);
單擊“執(zhí)行”按鈕,即可完成創(chuàng)建主鍵的操作,如圖5-7所示。執(zhí)行完成之后,使用“DESC Roominfo_02;”語句查看表結(jié)構(gòu),執(zhí)行結(jié)果如圖5-8所示。從結(jié)果可以看出Roomid字段上設(shè)置了主鍵約束。

圖5-7 修改表時添加主鍵

圖5-8 為Roomid列添加主鍵約束
注意:數(shù)據(jù)表創(chuàng)建完成后,如果需要給某個字段創(chuàng)建主鍵約束,該字段必須不允許為空,如果為空,則在創(chuàng)建主鍵約束時會報(bào)錯。
5.2.3 創(chuàng)建聯(lián)合主鍵約束
在數(shù)據(jù)表中,可以定義多個字段為聯(lián)合主鍵約束,如果對多字段定義了PRIMARY KEY約束,則一列中的值可能會重復(fù),但來自PRIMARY KEY約束定義中所有列的任何值組合必須唯一。語法格式如下:
PRIMARY KEY[字段1,字段2,…,字段n]
主要參數(shù)介紹如下。
- PRIMARY KEY:表示所添加約束的類型為主鍵約束。
- 字段n:表示要添加主鍵的多個字段。
【實(shí)例4】在Hotel數(shù)據(jù)庫中,定義客戶信息數(shù)據(jù)表userinfo,假設(shè)表中沒有主鍵id,為了唯一確定一個客戶信息,可以把name、tel聯(lián)合起來作為主鍵。輸入的SQL語句如下:

單擊“執(zhí)行”按鈕,即可完成數(shù)據(jù)表的創(chuàng)建以及聯(lián)合主鍵約束的添加操作,如圖5-9所示。執(zhí)行完成之后,使用“DESC userinfo;”語句查看表結(jié)構(gòu),執(zhí)行結(jié)果如圖5-10所示,從結(jié)果可以看出name字段和tel字段組合在一起成為userinfo的多字段聯(lián)合主鍵。

圖5-9 執(zhí)行SQL語句

圖5-10 為表添加聯(lián)合主鍵約束
5.2.4 刪除表中的主鍵
當(dāng)表中不需要指定PRIMARY KEY約束時,可以使用DROP語句將其刪除。通過DROP語句刪除PRIMARY KEY約束的語法格式如下:
ALTER TABLE table_name DROP PRIMARY KEY;
主要參數(shù)介紹如下。
- table_name:要刪除的主鍵約束的表名。
- PRIMARY KEY:主鍵約束關(guān)鍵字。
【實(shí)例5】在Hotel數(shù)據(jù)庫中,刪除Roominfo表中定義的主鍵。輸入以下SQL語句:
ALTER TABLE Roominfo DROP PRIMARY KEY;
單擊“執(zhí)行”按鈕,即可完成刪除主鍵的操作,如圖5-11所示。執(zhí)行完成之后,使用“DESC Roominfo;”語句查看表結(jié)構(gòu),執(zhí)行結(jié)果如圖5-12所示,從結(jié)果可以看出該數(shù)據(jù)表中的主鍵已經(jīng)被刪除。

圖5-11 執(zhí)行刪除主鍵約束

圖5-12 主鍵約束被刪除
- 深度實(shí)踐OpenStack:基于Python的OpenStack組件開發(fā)
- Java EE 6 企業(yè)級應(yīng)用開發(fā)教程
- Python爬蟲開發(fā):從入門到實(shí)戰(zhàn)(微課版)
- Python程序設(shè)計(jì)(第3版)
- Learning Python Design Patterns(Second Edition)
- 零基礎(chǔ)學(xué)Python數(shù)據(jù)分析(升級版)
- INSTANT OpenNMS Starter
- Building Minecraft Server Modifications
- C語言程序設(shè)計(jì)
- Mastering ROS for Robotics Programming
- Multithreading in C# 5.0 Cookbook
- LabVIEW虛擬儀器入門與測控應(yīng)用100例
- 深度探索Go語言:對象模型與runtime的原理特性及應(yīng)用
- 大話代碼架構(gòu):項(xiàng)目實(shí)戰(zhàn)版
- 算法訓(xùn)練營:海量圖解+競賽刷題(入門篇)