- MySQL數據庫管理與開發實踐教程 (清華電腦學堂)
- 程朝斌
- 2336字
- 2021-03-19 18:16:53
4.2 主鍵約束
一個表中可以有多個列,一個列中的數據有可能會重復。如學生信息表中,若有兩個學生重名,那么姓名列的數據將出現重復現象。那么在為學生統計分數的時候,如何才能更精確地找出一個學生,而不是與他重名的學生呢?這就需要為學生信息表設置一個主鍵。
主鍵是不允許有重復數據的列,能夠唯一地確認記錄,與該記錄的其他字段有沒有重復無關。如學生信息表,即使重名的學生姓名、性別、年齡等信息都相同,只要不是一個人,就可以為他們定義不同的主鍵值來確定不同學生。
本節介紹主鍵的概述和使用,包括主鍵的創建、修改和刪除等。
4.2.1 主鍵約束概述
主鍵是表的標識列,在MySQL中支持主鍵組的使用,即將多個字段作為一個主鍵來使用。這一組字段中的每個字段,作為主鍵的構成缺一不可。對主鍵的操作即對這一組字段的操作。
若表中具有實際意義的字段無法作為主鍵,那么可以為表添加一個字段作為主鍵。在日常應用中,主鍵往往是沒有實際意義的列,這樣能夠有效避免字段因實際情況對數據產生影響。如有些網站為用戶設置不同的用戶名來作為主鍵,那么用戶注冊或修改用戶名將變得很麻煩。此時只需要另外添加一個字段作為主鍵,由系統分配一個唯一的數據作為主鍵的值即可。
關系數據庫依賴于主鍵,它是數據庫物理模式的基石。主鍵在物理層面上只有兩個用途,如下所示。
(1)唯一地標識一行記錄。
(2)作為一個可以被外鍵引用的有效對象。
基于以上這兩個用途,在設計物理層面的主鍵時需要遵循以下原則。
(1)MySQL主鍵通常是單列的,以便提高連接和篩選操作的效率。但MySQL支持復合主鍵的使用。
(2)主鍵通常不需要更換,能夠唯一地標識一行數據。
(3)MySQL主鍵通常是對用戶沒有意義的。
(4)MySQL主鍵最好不要包含動態變化的數據,如時間戳、創建時間列、修改時間列等。
(5)MySQL主鍵通常由計算機自動生成,如對主鍵添加自增約束。
4.2.2 創建主鍵約束
主鍵是表中最重要的約束,一個表可以沒有其他約束,但一定要有主鍵。在MySQL中,沒有主鍵的表,將不允許在MySQL Workbench工具下對表中的數據進行添加、修改和刪除,只能夠查詢到表中已有的數據。因為沒有主鍵的表是違反了數據安全性管理的。本節介紹主鍵的創建,可以使用MySQL Workbench或使用SQL語句實現主鍵的創建。
1.MySQL Workbench創建主鍵
在MySQL Workbench工具下,創建表的時候可以直接創建主鍵,如圖4-1所示。其操作可參考3.4.1節。

圖4-1 創建約束
如圖4-1所示,在新建表的時候,第一個列默認是主鍵約束列,被勾選了PK和NN兩個復選框。選中該列時,界面下方將顯示該列詳細的屬性。
圖4-1中選中的是第一列,勾選了PK和NN兩個復選框,下方的Primary和Not Null復選框也處于選中狀態。PK復選框與Primary復選框是相對應的;NN與Not Null是一個意思。
所有約束的創建都是在如圖4-1所示的界面中進行,對圖中約束的復選框介紹如下。
(1)PK:與Primary一樣,表示主鍵約束。
(2)NN:與Not Null一樣,表示不能為空,是非空約束。
(3)UQ:與Unique一樣,表示數據不重復,是唯一約束。
(4)BIN:與Binary一樣,表示二進制存儲。
(5)UN:與Unsigned一樣,表示整數。
(6)ZF:與Zero Fill一樣,表示數值中空白區域以0填補。
(7)AI:與Auto Increment一樣,是自增約束。
(8)Default:默認值約束。
由于主鍵是列的唯一標識,因此主鍵不能為空,在設置主鍵時將默認添加主鍵約束和非空約束。另外,主鍵即使不添加唯一約束,也是不能有重復數據的。選中需要為列添加的約束,即可單擊Apply按鈕執行數據表創建;接著在彈出對話框中單擊Apply按鈕確認執行SQL語句;最后在彈出的對話框中單擊Finish按鈕完成數據表的創建。
2.SQL語句創建主鍵
使用SQL語句同樣可以創建主鍵。主鍵分為單字段主鍵和復合主鍵,其用法如下所示。
(1)單字段主鍵只需在創建語句中,字段的數據類型后面添加PRIMARY KEY語句即可。
(2)復合主鍵需要在字段創建語句后,添加PRIMARY KEY(字段列表)語句,在KEY關鍵字后的括號中,寫入需要設置為主鍵的字段列表,只用逗號隔開。
【范例1】
創建一個表,有主鍵id和字段name,代碼如下。
CREATE TABLE 'shop'.'newtable' ( 'id' INT NOT NULL, 'name' VARCHAR(45) NULL, PRIMARY KEY ('id'));
上述代碼創建了單字段主鍵id。
【范例2】
創建一個表,有id、name和pas字段,其中id和name字段構成復合主鍵,代碼如下。
CREATE TABLE 'shop'.'table' ( 'id' INT NOT NULL, 'name' VARCHAR(45) NOT NULL, 'pas' VARCHAR(45) NULL, PRIMARY KEY ('id', 'name'));
4.2.3 修改主鍵約束
修改主鍵包括兩種,一種是在沒有主鍵的表中設置主鍵,一種是有主鍵的表中將主鍵換到其他的字段。主鍵的修改可以在MySQL Workbench中進行,也可以使用SQL語句執行。
1.MySQL Workbench修改主鍵
在MySQL Workbench中修改主鍵與修改字段屬性的方式一樣,首先打開表修改界面,如圖4-2所示。

圖4-2 修改約束
如圖4-2所示,該圖雖然和圖4-1很相似,但圖4-1是創建表的界面,而圖4-2是表修改的界面。在界面中可以設置、取消或修改主鍵,也可以修改其他的約束,在設置完成后單擊Apply按鈕執行約束的修改;接著在彈出對話框中單擊Apply按鈕確認執行SQL語句;最后在彈出的對話框中單擊Finish按鈕完成約束的修改。這里所說的修改包括約束的添加、刪除和替換;而且可以是對任意約束進行的,不僅是主鍵約束的修改。
2.SQL語句修改主鍵
使用SQL語句修改主鍵沒有MySQL Workbench工具那么輕松,需要區分兩種方式:一種是在沒有主鍵的表中設置主鍵,一種是有主鍵的表中將主鍵換到其他的字段。
表中沒有主鍵,通過修改指定字段的類型來設置其主鍵,與修改字段的類型方式一樣,如范例3所示。
【范例3】
為shop.newtable表的id列設置主鍵,代碼如下。
ALTER TABLE 'shop'.'newtable' CHANGE COLUMN 'id' 'id' INT(11) NOT NULL , ADD PRIMARY KEY ('id');
上述代碼中,由于字段是在id列,因此只需要修改id列的數據類型,并使用ADD PRIMARY KEY()添加新的主鍵。
表中已經有主鍵的,在修改主鍵時分為兩個步驟:刪除原有主鍵;添加新的主鍵。因此在創建之前首先要刪除原有主鍵,如范例4所示。
【范例4】
刪除shop.newtable表的id列的主鍵,將主鍵轉移到name列,代碼如下。
ALTER TABLE 'shop'.'newtable' CHANGE COLUMN 'id' 'id' INT(11) NULL , CHANGE COLUMN 'name' 'name' VARCHAR(45) NOT NULL , DROP PRIMARY KEY, ADD PRIMARY KEY ('name');
由于將主鍵由id列轉移到name列,涉及兩個列的換行,因此需要修改這兩個列的數據類型。同時使用DROP PRIMARY KEY語句刪除主鍵;使用ADD PRIMARY KEY()添加新的主鍵。
- Vue.js 2 and Bootstrap 4 Web Development
- Cocos2d-x游戲開發:手把手教你Lua語言的編程方法
- 深入淺出Java虛擬機:JVM原理與實戰
- Linux環境編程:從應用到內核
- MySQL數據庫管理與開發(慕課版)
- PHP編程基礎與實例教程
- Processing創意編程指南
- Clojure High Performance Programming(Second Edition)
- R語言實戰(第2版)
- Joomla!Search Engine Optimization
- Python 3.8編程快速入門
- 活文檔:與代碼共同演進
- 趣學Python游戲編程
- XML程序設計案例教程
- HTML5+CSS3+JavaScript從入門到精通(微課精編版)