MySQL怎麼設定外鍵約束?

青灯夜游
發布: 2019-05-23 18:57:02
原創
15017 人瀏覽過

MySQL怎麼設定外鍵約束?

MySQL 外鍵約束(FOREIGN KEY)用來在兩個表的資料之間建立鏈接,它可以是一列或多列。一個表可以有一個或多個外鍵。

外鍵對應的是參考完整性,一個表的外鍵可以為空值,若不為空值,則每一個外鍵的值必須等於另一個表中主鍵的某個值。

外鍵是表的一個字段,不是本表的主鍵,但對應另一個表的主鍵。定義外鍵後,不允許刪除另一個表中具有關聯關係的行。

外鍵的主要功能是保持資料的一致性、完整性。例如,部門表 tb_dept 的主鍵是 id,在員工表 tb_emp5 中有一個鍵 deptId 與這個 id 關聯。主表(父表):對於兩個具有關聯關係的表而言,相關聯欄位中主鍵所在的表就是主表。從表(子表):對於兩個具有關聯關係的表而言,相關聯字段中外鍵所在的表就是從表。

選取設定MySQL 外鍵約束的欄位

#定義外鍵時,需要遵守下列規則:

父表必須已經存在於資料庫中,或是目前正在建立的表。如果是後一種情況,則父表與子表是同一個表,這樣的表稱為自參照表,這種結構稱為自參照完整性。

必須為父表定義主鍵。

主鍵不能包含空值,但允許在外鍵中出現空值。也就是說,只要外鍵的每個非空值出現在指定的主鍵中,這個外鍵的內容就是正確的。

在父表的表名後面指定列名或列名的組合。這個列或列的組合必須是父表的主鍵或候選鍵。

外鍵中列的數目必須和父表的主鍵中列的數目相同。

外鍵中列的資料型別必須和父表主鍵中對應列的資料型別相同。

在建立表格時設定外鍵約束

#在資料表中建立外鍵使用FOREIGN KEY 關鍵字,具體的語法規則如下:

[CONSTRAINT <外键名>] FOREIGN KEY 字段名 [,字段名2,…]
REFERENCES <主表名> 主键列1 [,主键列2,…]
登入後複製

其中:外鍵名為定義的外鍵約束的名稱,一個表中不能有相同名稱的外鍵;字段名表示子表需要添加外健約束的字段列;主表名即被子表外鍵所依賴的表的名稱;主鍵列表示主表中定義的主鍵列或列組合。

範例:為了展現表與表之間的外鍵關係,本例在 test_db 資料庫中建立一個部門表 tb_dept1,表結構如下表所示。

建立 tb_dept1 的 SQL 語句運行結果如下所示。

mysql> CREATE TABLE tb_dept1
    -> (
    -> id INT(11) PRIMARY KEY,
    -> name VARCHAR(22) NOT NULL,
    -> location VARCHAR(50)
    -> );
Query OK, 0 rows affected (0.37 sec)
登入後複製

建立資料表 tb_emp6,並在表 tb_emp6 上建立外鍵約束,讓它的鍵 deptId 作為外鍵關聯到表 tb_dept1 的主鍵 id,輸入的 SQL 語句和運行結果如下所示。

mysql> CREATE TABLE tb_emp6
    -> (
    -> id INT(11) PRIMARY KEY,
    -> name VARCHAR(25),
    -> deptId INT(11),
    -> salary FLOAT,
    -> CONSTRAINT fk_emp_dept1
    -> FOREIGN KEY(deptId) REFERENCES tb_dept1(id)
    -> );
Query OK, 0 rows affected (0.37 sec)
mysql> DESC tb_emp6;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| id     | int(11)     | NO   | PRI | NULL    |       |
| name   | varchar(25) | YES  |     | NULL    |       |
| deptId | int(11)     | YES  | MUL | NULL    |       |
| salary | float        | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
4 rows in set (1.33 sec)
登入後複製

以上語句執行成功之後,在表 tb_emp6 上新增了名稱為 fk_emp_dept1 的外鍵約束,外鍵名稱為 deptId,其依賴表 tb_dept1 的主鍵 id。

提示:關聯指的是關係資料庫中,相關表之間的聯繫。它是透過相同的屬性或屬性組來表示的。子表的外鍵必須關聯父表的主鍵,且關聯欄位的資料類型必須匹配,如果類型不一樣,則在建立子表時會出現錯誤「ERROR 1005(HY000):Can't create table' database.tablename'(errno:150)」。

在修改表時新增外鍵約束

#在修改資料表時新增外鍵約束的語法規則為:

ALTER TABLE <数据表名> ADD CONSTRAINT <索引名>
FOREIGN KEY(<列名>) REFERENCES <主表名> (<列名>);
登入後複製

範例:修改資料表tb_emp2,將欄位deptId 設定為外鍵,與資料表tb_dept1 的主鍵id 進行關聯,輸入的SQL 語句和執行結果如下所示。

mysql> ALTER TABLE tb_emp2
    -> ADD CONSTRAINT fk_tb_dept1
    -> FOREIGN KEY(deptId)
    -> REFERENCES tb_dept1(id);
Query OK, 0 rows affected (1.38 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> SHOW CREATE TABLE tb_emp2\G
*************************** 1. row ***************************
       Table: tb_emp2
Create Table: CREATE TABLE `tb_emp2` (
  `id` int(11) NOT NULL,
  `name` varchar(30) DEFAULT NULL,
  `deptId` int(11) DEFAULT NULL,
  `salary` float DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_tb_dept1` (`deptId`),
  CONSTRAINT `fk_tb_dept1` FOREIGN KEY (`deptId`) REFERENCES `tb_dept1` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312
1 row in set (0.12 sec)
登入後複製

刪除外鍵約束

對於資料庫中定義的外鍵,如果不再需要,可以將其刪除。外鍵一旦刪除,就會解除主表和從表間的關聯關係,MySQL 中刪除外鍵的語法格式如下:

ALTER TABLE <表名> DROP FOREIGN KEY <外键约束名>;
登入後複製

範例:刪除資料表tb_emp2 中的外鍵約束fk_tb_dept1,輸入的SQL 語句和運行結果如下圖所示。

mysql> ALTER TABLE tb_emp2
    -> DROP FOREIGN KEY fk_tb_dept1;
Query OK, 0 rows affected (0.19 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> SHOW CREATE TABLE tb_emp2\G
*************************** 1. row ***************************
       Table: tb_emp2
Create Table: CREATE TABLE `tb_emp2` (
  `id` int(11) NOT NULL,
  `name` varchar(30) DEFAULT NULL,
  `deptId` int(11) DEFAULT NULL,
  `salary` float DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_tb_dept1` (`deptId`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312
1 row in set (0.00 sec)
登入後複製

可以看到,tb_emp2 中已經不存在 FOREIGN KEY,原有的名稱為 fk_emp_dept 的外鍵約束刪除成功。

以上是MySQL怎麼設定外鍵約束?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板