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

5.3 外鍵約束

外鍵用來在兩個表的數據之間建立鏈接,它可以是一列或者多列。首先,被引用表的關聯字段上應該創建PRIMARY KEY約束或UNIQUE約束,然后,在應用表的字段上創建FOREIGN KEY約束,從而創建外鍵。

5.3.1 創建表時添加外鍵約束

外鍵約束的主要作用是保證數據引用的完整性,定義外鍵后,不允許刪除在另一個表中具有關聯的行。例如,部門表tb_dept的主鍵id,在員工表emp中有一個鍵deptId與這個id關聯。外鍵約束中涉及的數據表有主表與從表之分,具體介紹如下。

  • 主表(父表):對于兩個具有關聯關系的表而言,相關聯字段中主鍵所在的那個表即是主表。
  • 從表(子表):對于兩個具有關聯關系的表而言,相關聯字段中外鍵所在的那個表即是從表。

創建外鍵約束的語法格式如下:

主要參數介紹如下。

  • 外鍵名:定義的外鍵約束的名稱,一個表中不能有相同名稱的外鍵。
  • 字段名:從表需要創建外鍵約束的字段列,可以由多個列組成。
  • 主表名:被從表外鍵所依賴的表的名稱。
  • 主鍵列:被應用的表中的列名,也可以由多個列組成。

這里以圖書信息表(表5-2)Bookinfo與圖書分類(表5-3)Booktype為例,介紹創建外鍵約束的過程。

表5-2 圖書信息表結構

表5-3 圖書分類表結構

【實例6】在test數據庫中,定義數據表Bookinfo,并在Bookinfo表上創建外鍵約束。

首先創建test數據庫,然后指定數據庫,并創建圖書分類表Booktype,輸入以下SQL語句:

單擊“執行”按鈕,即可完成創建數據表的操作,如圖5-13所示。執行完成之后,使用“DESC Booktype;”語句即可看到該數據表的結構,如圖5-14所示。

圖5-13 創建表Booktype

圖5-14 Booktype表結構

下面定義數據表Bookinfo,讓它的Typeid字段作為外鍵關聯到Booktype數據表中的主鍵id,輸入以下SQL語句:

單擊“執行”按鈕,即可完成在創建數據表時創建外鍵約束的操作,如圖5-15所示。

圖5-15 創建表的外鍵約束

執行完成后,使用“DESC Bookinfo;”語句即可看到該數據表的結構。這樣就在表Bookinfo上添加了名稱為“fk_圖書分類編號”的外鍵約束,其依賴于表Booktype的主鍵id,如圖5-16所示。

提示:外鍵一般不需要與相應的主鍵名稱相同,但為了便于識別,當外鍵與相應主鍵在不同的數據表中時,通常使用相同的名稱。另外,外鍵不一定要與相應的主鍵在不同的數據表中,也可以是同一個數據表。

圖5-16 Bookinfo表的結構

5.3.2 修改表時添加外鍵約束

如果創建數據表時沒有創建外鍵,可以使用ALTER語句對現有表創建外鍵。使用ALTER語句可以將外鍵約束添加到數據表中,添加外鍵約束的語法格式如下:

主要參數介紹如下。

  • CONSTRAINT:創建約束的關鍵字。
  • fk_name:設置外鍵約束的名稱。
  • FOREIGN KEY:所創建約束的類型為外鍵約束。

【實例7】在test數據庫中,假設創建Bookinfo數據表時沒有設置外鍵約束,如果想要添加外鍵約束,輸入如下SQL語句:

    ALTER TABLE Bookinfo
    ADD
    CONSTRAINT fk_圖書分類
    FOREIGN KEY(Typeid) REFERENCES Booktype(id);

單擊“執行”按鈕,即可完成在創建數據表后添加外鍵約束的操作,如圖5-17所示。該語句執行之后的結果與創建數據表時創建外鍵約束的結果是一樣的。

注意:在為數據表創建外鍵時,主鍵表與外鍵表,必須創建相應的主鍵約束,否則在創建外鍵的過程中,會給出警告信息。

圖5-17 執行SQL語句

5.3.3 刪除表中的外鍵約束

當數據表中不需要使用外鍵時,可以將其刪除。刪除外鍵約束的方法和刪除主鍵約束的方法相同,刪除時指定外鍵名稱。

通過DROP語句刪除外鍵約束的語法格式如下:

    ALTER TABLE table_name
    DROP FOREIGN KEY fk_name;

主要參數介紹如下。

  • table_name:要刪除的外鍵約束的表名。
  • fk_name:外鍵約束的名字。

【實例8】在test數據庫中,刪除Bookinfo表中添加的“fk_圖書分類”外鍵,輸入如下SQL語句:

    ALTER TABLE Bookinfo
    DROP FOREIGN KEY fk_圖書分類;

單擊“執行”按鈕,即可完成在刪除外鍵約束的操作,如圖5-18所示。

圖5-18 刪除外鍵約束

主站蜘蛛池模板: 临夏市| 始兴县| 大洼县| 岗巴县| 武川县| 新化县| 邻水| 墨玉县| 桃园县| 兴和县| 宁安市| 都昌县| 古田县| 竹溪县| 攀枝花市| 塔城市| 杨浦区| 宝应县| 建湖县| 抚顺市| 江西省| 望都县| 德钦县| 赤壁市| 东阿县| 安吉县| 鄯善县| 特克斯县| 贞丰县| 南城县| 屯门区| 运城市| 平乡县| 新余市| 平乐县| 治多县| 弋阳县| 大关县| 安吉县| 巴东县| 岳普湖县|