您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關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設置外鍵約束的方法就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。