官术网_书友最值得收藏!

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()添加新的主鍵。

主站蜘蛛池模板: 左云县| 乡城县| 铜川市| 宜君县| 吉林市| 错那县| 五原县| 兴业县| 洛南县| 乌拉特后旗| 边坝县| 元朗区| 交口县| 保康县| 武山县| 台中市| 乌苏市| 仪征市| 长沙县| 孝昌县| 盘锦市| 武定县| 嘉峪关市| 民乐县| 宁南县| 云阳县| 仙游县| 饶阳县| 玉屏| 石屏县| 鹰潭市| 高密市| 正蓝旗| 雷山县| 铁力市| 贵州省| 沙洋县| 阿勒泰市| 安阳县| 安泽县| 荆州市|