這篇文章將為大家詳細(xì)講解有關(guān)MySQL如何實(shí)現(xiàn)主外鍵約束,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
創(chuàng)新互聯(lián)公司是一家以網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)、品牌設(shè)計(jì)、軟件運(yùn)維、seo優(yōu)化、小程序App開(kāi)發(fā)等移動(dòng)開(kāi)發(fā)為一體互聯(lián)網(wǎng)公司。已累計(jì)為成都LED顯示屏等眾行業(yè)中小客戶(hù)提供優(yōu)質(zhì)的互聯(lián)網(wǎng)建站和軟件開(kāi)發(fā)服務(wù)。
mysql主鍵約束的寫(xiě)法:“CREATE TABLE 表名(字段名 數(shù)據(jù)類(lèi)型 PRIMARY KEY)”;mysql外鍵約束的寫(xiě)法:“CREATE TABLE 表名(FOREIGN KEY 字段名 REFERENCES 主表名 主鍵列)”。
mysql主鍵約束
主鍵(PRIMARY KEY)的完整稱(chēng)呼是“主鍵約束”,是 MySQL 中使用最為頻繁的約束。一般情況下,為了便于 DBMS 更快的查找到表中的記錄,都會(huì)在表中設(shè)置一個(gè)主鍵。
1、在創(chuàng)建表時(shí)設(shè)置主鍵約束
在 CREATE TABLE 語(yǔ)句中,通過(guò) PRIMARY KEY 關(guān)鍵字來(lái)指定主鍵。
在定義字段的同時(shí)指定主鍵,語(yǔ)法格式如下:
<字段名> <數(shù)據(jù)類(lèi)型> PRIMARY KEY [默認(rèn)值]
例 1
在 test_db 數(shù)據(jù)庫(kù)中創(chuàng)建 tb_emp3 數(shù)據(jù)表,其主鍵為 id,SQL 語(yǔ)句和運(yùn)行結(jié)果如下。
mysql> CREATE TABLE tb_emp3 -> ( -> id INT(11) PRIMARY KEY, -> name VARCHAR(25), -> deptId INT(11), -> salary FLOAT -> ); Query OK, 0 rows affected (0.37 sec) mysql> DESC tb_emp3; +--------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(25) | YES | | NULL | | | deptId | int(11) | YES | | NULL | | | salary | float | YES | | NULL | | +--------+-------------+------+-----+---------+-------+ 4 rows in set (0.14 sec)
或者是在定義完所有字段之后指定主鍵,語(yǔ)法格式如下:
[CONSTRAINT <約束名>] PRIMARY KEY [字段名]
例 2
在 test_db 數(shù)據(jù)庫(kù)中創(chuàng)建 tb_emp4 數(shù)據(jù)表,其主鍵為 id,SQL 語(yǔ)句和運(yùn)行結(jié)果如下。
mysql> CREATE TABLE tb_emp4 -> ( -> id INT(11), -> name VARCHAR(25), -> deptId INT(11), -> salary FLOAT, -> PRIMARY KEY(id) -> ); Query OK, 0 rows affected (0.37 sec) mysql> DESC tb_emp4; +--------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(25) | YES | | NULL | | | deptId | int(11) | YES | | NULL | | | salary | float | YES | | NULL | | +--------+-------------+------+-----+---------+-------+ 4 rows in set (0.14 sec)
2、在修改表時(shí)添加主鍵約束
主鍵約束不僅可以在創(chuàng)建表的同時(shí)創(chuàng)建,也可以在修改表時(shí)添加。但是需要注意的是,設(shè)置成主鍵約束的字段中不允許有空值。
在修改數(shù)據(jù)表時(shí)添加主鍵約束的語(yǔ)法格式如下:
ALTER TABLE <數(shù)據(jù)表名> ADD PRIMARY KEY(<字段名>);
查看 tb_emp2 數(shù)據(jù)表的表結(jié)構(gòu),SQL 語(yǔ)句和運(yùn)行結(jié)果如下所示。
mysql> DESC tb_emp2; +--------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+-------------+------+-----+---------+-------+ | id | int(11) | NO | | NULL | | | name | varchar(30) | YES | | NULL | | | deptId | int(11) | YES | | NULL | | | salary | float | YES | | NULL | | +--------+-------------+------+-----+---------+-------+ 4 rows in set (0.14 sec)
例 3
修改數(shù)據(jù)表 tb_emp2,將字段 id 設(shè)置為主鍵,SQL 語(yǔ)句和運(yùn)行結(jié)果如下。
mysql> ALTER TABLE tb_emp2 -> ADD PRIMARY KEY(id); Query OK, 0 rows affected (0.94 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> DESC tb_emp2; +--------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(30) | YES | | NULL | | | deptId | int(11) | YES | | NULL | | | salary | float | YES | | NULL | | +--------+-------------+------+-----+---------+-------+ 4 rows in set (0.12 sec)
通常情況下,當(dāng)在修改表時(shí)要設(shè)置表中某個(gè)字段的主鍵約束時(shí),要確保設(shè)置成主鍵約束的字段中值不能夠有重復(fù)的,并且要保證是非空的。否則,無(wú)法設(shè)置主鍵約束。
mysql外鍵約束
MySQL 外鍵約束(FOREIGN KEY)是表的一個(gè)特殊字段,經(jīng)常與主鍵約束一起使用。對(duì)于兩個(gè)具有關(guān)聯(lián)關(guān)系的表而言,相關(guān)聯(lián)字段中主鍵所在的表就是主表(父表),外鍵所在的表就是從表(子表)。
外鍵用來(lái)建立主表與從表的關(guān)聯(lián)關(guān)系,為兩個(gè)表的數(shù)據(jù)建立連接,約束兩個(gè)表中數(shù)據(jù)的一致性和完整性。比如,一個(gè)水果攤,只有蘋(píng)果、桃子、李子、西瓜等 4 種水果,那么,你來(lái)到水果攤要買(mǎi)水果就只能選擇蘋(píng)果、桃子、李子和西瓜,其它的水果都是不能購(gòu)買(mǎi)的。
定義外鍵時(shí),需要遵守下列規(guī)則:
主表必須已經(jīng)存在于數(shù)據(jù)庫(kù)中,或者是當(dāng)前正在創(chuàng)建的表。如果是后一種情況,則主表與從表是同一個(gè)表,這樣的表稱(chēng)為自參照表,這種結(jié)構(gòu)稱(chēng)為自參照完整性。
必須為主表定義主鍵。
主鍵不能包含空值,但允許在外鍵中出現(xiàn)空值。也就是說(shuō),只要外鍵的每個(gè)非空值出現(xiàn)在指定的主鍵中,這個(gè)外鍵的內(nèi)容就是正確的。
在主表的表名后面指定列名或列名的組合。這個(gè)列或列的組合必須是主表的主鍵或候選鍵。
外鍵中列的數(shù)目必須和主表的主鍵中列的數(shù)目相同。
外鍵中列的數(shù)據(jù)類(lèi)型必須和主表主鍵中對(duì)應(yīng)列的數(shù)據(jù)類(lèi)型相同。
1、在創(chuàng)建表時(shí)設(shè)置外鍵約束
在 CREATE TABLE 語(yǔ)句中,通過(guò) FOREIGN KEY 關(guān)鍵字來(lái)指定外鍵,具體的語(yǔ)法格式如下:
[CONSTRAINT <外鍵名>] FOREIGN KEY 字段名 [,字段名2,…] REFERENCES <主表名> 主鍵列1 [,主鍵列2,…]
例 4
為了展現(xiàn)表與表之間的外鍵關(guān)系,本例在 test_db 數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)部門(mén)表 tb_dept1,表結(jié)構(gòu)如下表所示。
字段名稱(chēng) | 數(shù)據(jù)類(lèi)型 | 備注 |
---|---|---|
id | INT(11) | 部門(mén)編號(hào) |
name | VARCHAR(22) | 部門(mén)名稱(chēng) |
location | VARCHAR(22) | 部門(mén)位置 |
創(chuàng)建 tb_dept1 的 SQL 語(yǔ)句和運(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ǔ)句和運(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)
以上語(yǔ)句執(zhí)行成功之后,在表 tb_emp6 上添加了名稱(chēng)為 fk_emp_dept1 的外鍵約束,外鍵名稱(chēng)為 deptId,其依賴(lài)于表 tb_dept1 的主鍵 id。
注意:從表的外鍵關(guān)聯(lián)的必須是主表的主鍵,且主鍵和外鍵的數(shù)據(jù)類(lèi)型必須一致。例如,兩者都是 INT 類(lèi)型,或者都是 CHAR 類(lèi)型。如果不滿(mǎn)足這樣的要求,在創(chuàng)建從表時(shí),就會(huì)出現(xiàn)“ERROR 1005(HY000): Can't create table”錯(cuò)誤。
2、在修改表時(shí)添加外鍵約束
外鍵約束也可以在修改表時(shí)添加,但是添加外鍵約束的前提是:從表中外鍵列中的數(shù)據(jù)必須與主表中主鍵列中的數(shù)據(jù)一致或者是沒(méi)有數(shù)據(jù)。
在修改數(shù)據(jù)表時(shí)添加外鍵約束的語(yǔ)法格式如下:
ALTER TABLE <數(shù)據(jù)表名> ADD CONSTRAINT <外鍵名> FOREIGN KEY(<列名>) REFERENCES <主表名> (<列名>);
例 5
修改數(shù)據(jù)表 tb_emp2,將字段 deptId 設(shè)置為外鍵,與數(shù)據(jù)表 tb_dept1 的主鍵 id 進(jìn)行關(guān)聯(lián),SQL 語(yǔ)句和運(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_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)
注意:在為已經(jīng)創(chuàng)建好的數(shù)據(jù)表添加外鍵約束時(shí),要確保添加外鍵約束的列的值全部來(lái)源于主鍵列,并且外鍵列不能為空。
關(guān)于mysql如何實(shí)現(xiàn)主外鍵約束就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
網(wǎng)站名稱(chēng):mysql如何實(shí)現(xiàn)主外鍵約束
網(wǎng)頁(yè)鏈接:http://sd-ha.com/article4/iedjie.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、建站公司、企業(yè)建站、手機(jī)網(wǎng)站建設(shè)、商城網(wǎng)站、定制網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)