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

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 主鍵約束被刪除

主站蜘蛛池模板: 宁国市| 柏乡县| 资中县| 德昌县| 金门县| 和静县| 滨海县| 秦皇岛市| 南靖县| 合江县| 馆陶县| 五莲县| 姚安县| 涡阳县| 河南省| 南乐县| 博罗县| 昭觉县| 宜兰市| 静乐县| 垣曲县| 新乐市| 化隆| 黔南| 澎湖县| 吴堡县| 平罗县| 博爱县| 葫芦岛市| 荥阳市| 安远县| 镇平县| 南昌市| 怀仁县| 神木县| 老河口市| 扬州市| 吴堡县| 鄄城县| 青铜峡市| 万山特区|