MySQL怎么設(shè)置外鍵約束?

MySQL怎么設(shè)置外鍵約束?

mysql?外鍵約束(foreign key)用來在兩個(gè)表的數(shù)據(jù)之間建立鏈接,它可以是一列或者多列。一個(gè)表可以有一個(gè)或多個(gè)外鍵。

外鍵對應(yīng)的是參照完整性,一個(gè)表的外鍵可以為空值,若不為空值,則每一個(gè)外鍵的值必須等于另一個(gè)表中主鍵的某個(gè)值。

外鍵是表的一個(gè)字段,不是本表的主鍵,但對應(yīng)另一個(gè)表的主鍵。定義外鍵后,不允許刪除另一個(gè)表中具有關(guān)聯(lián)關(guān)系的行。

外鍵的主要作用是保持?jǐn)?shù)據(jù)的一致性、完整性。例如,部門表 tb_dept 的主鍵是 id,在員工表 tb_emp5 中有一個(gè)鍵 deptId 與這個(gè) id 關(guān)聯(lián)。主表(父表):對于兩個(gè)具有關(guān)聯(lián)關(guān)系的表而言,相關(guān)聯(lián)字段中主鍵所在的表就是主表。從表(子表):對于兩個(gè)具有關(guān)聯(lián)關(guān)系的表而言,相關(guān)聯(lián)字段中外鍵所在的表就是從表。

選取設(shè)置 mysql 外鍵約束的字段

定義一個(gè)外鍵時(shí),需要遵守下列規(guī)則:

父表必須已經(jīng)存在于數(shù)據(jù)庫中,或者是當(dāng)前正在創(chuàng)建的表。如果是后一種情況,則父表與子表是同一個(gè)表,這樣的表稱為自參照表,這種結(jié)構(gòu)稱為自參照完整性。

必須為父表定義主鍵。

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

在父表的表名后面指定列名或列名的組合。這個(gè)列或列的組合必須是父表的主鍵或候選鍵。

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

外鍵中列的數(shù)據(jù)類型必須和父表主鍵中對應(yīng)列的數(shù)據(jù)類型相同。

在創(chuàng)建表時(shí)設(shè)置外鍵約束

在數(shù)據(jù)表中創(chuàng)建外鍵使用 FOREIGN KEY 關(guān)鍵字,具體的語法規(guī)則如下:

[CONSTRAINT?]?FOREIGN?KEY?字段名?[,字段名2,…] REFERENCES??主鍵列1?[,主鍵列2,…]

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

示例:為了展現(xiàn)表與表之間的外鍵關(guān)系,本例在 test_db 數(shù)據(jù)庫中創(chuàng)建一個(gè)部門表 tb_dept1,表結(jié)構(gòu)如下表所示。

創(chuàng)建 tb_dept1 的 SQL 語句運(yùn)行結(jié)果如下所示。

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)

創(chuàng)建數(shù)據(jù)表 tb_emp6,并在表 tb_emp6 上創(chuàng)建外鍵約束,讓它的鍵 deptId 作為外鍵關(guān)聯(lián)到表 tb_dept1 的主鍵 id,輸入的 SQL 語句和運(yùn)行結(jié)果如下所示。

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)

以上語句執(zhí)行成功之后,在表 tb_emp6 上添加了名稱為 fk_emp_dept1 的外鍵約束,外鍵名稱為 deptId,其依賴于表 tb_dept1 的主鍵 id。

提示:關(guān)聯(lián)指的是關(guān)系數(shù)據(jù)庫中,相關(guān)表之間的聯(lián)系。它是通過相同的屬性或?qū)傩越M來表示的。子表的外鍵必須關(guān)聯(lián)父表的主鍵,且關(guān)聯(lián)字段的數(shù)據(jù)類型必須匹配,如果類型不一樣,則創(chuàng)建子表時(shí)會出現(xiàn)錯(cuò)誤“ERROR 1005(HY000):Can’t create table’database.tablename'(errno:150)”。

在修改表時(shí)添加外鍵約束

在修改數(shù)據(jù)表時(shí)添加外鍵約束的語法規(guī)則為:

ALTER?TABLE??ADD?CONSTRAINT? FOREIGN?KEY()?REFERENCES??();

示例:修改數(shù)據(jù)表 tb_emp2,將字段 deptId 設(shè)置為外鍵,與數(shù)據(jù)表 tb_dept1 的主鍵 id 進(jìn)行關(guān)聯(lián),輸入的 SQL 語句和運(yùn)行結(jié)果如下所示。

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_emp2G ***************************?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)

刪除外鍵約束

對于數(shù)據(jù)庫中定義的外鍵,如果不再需要,可以將其刪除。外鍵一旦刪除,就會解除主表和從表間的關(guān)聯(lián)關(guān)系,MySQL 中刪除外鍵的語法格式如下:

ALTER?TABLE??DROP?FOREIGN?KEY?;

示例:刪除數(shù)據(jù)表 tb_emp2 中的外鍵約束 fk_tb_dept1,輸入的 SQL 語句和運(yùn)行結(jié)果如下所示。

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_emp2G ***************************?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 中已經(jīng)不存在 FOREIGN KEY,原有的名稱為 fk_emp_dept 的外鍵約束刪除成功。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊10 分享