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中文網其他相關文章!