?

約束ヽ(′ー`)ノ保證了數據(ju)的數束實(shí)完整性和一致性。下面這篇文章主要給大家介紹了關(guān)于MariaDB數據庫的據庫鍵約解外鍵約束的相關(guān)資料,文中通過(guò)示(′▽?zhuān)?)例代碼介紹的例詳非常詳細,需要的數束實(shí)朋友可以參考借鑒,下面隨著(zhù)小編來(lái)一起學(xué)習學(xué)習吧
外鍵
外鍵的據庫鍵約解用途是確保數據的完整性。它通常包括以下幾(ji)種:
1 實(shí)體完整性,例詳確保每個(gè)實(shí)體是數束實(shí)唯一的(通過(guò)主鍵來(lái)實(shí)施)
3 關(guān)聯(lián)完整性,確保每個(gè)外鍵或是例詳NULL(如果允許的話(huà))或含有與相關(guān)主鍵值相配的值
1.什么是外鍵約束(shu)
與主鍵約??束不同,創(chuàng )建外鍵約束不會(huì )(hui)自動(dòng)創(chuàng )建對應的數束實(shí)索引。 但是據庫鍵約??解由于以下原因,對外鍵手動(dòng)創(chuàng )建索引ヾ(′?`)?通常是例詳有用的:
當在查詢(xún)中組合相關(guān)表中的數據時(shí),經(jīng)常在(zai)聯(lián)接條件中使用外鍵列,數束實(shí)方法是據庫鍵約解將一個(gè)表的外鍵約束中的一列或多列與另一個(gè)表中的主鍵列或唯一鍵列匹配。 索引使?? 數據庫引擎 可以在外鍵表中快速查找相關(guān)數據。例詳 但是,創(chuàng )建此(ci)索引并不是必需的。 即使沒(méi)有對兩個(gè)相關(guān)表定義主鍵或外鍵約束,也可以對來(lái)自這兩個(gè)表中的數據進(jìn)行組合,但兩個(gè)表間的外鍵關(guān)(′?_?`)系說(shuō)明已用其鍵作為條件對其進(jìn)行了優(yōu)化,以便組合到查詢(xún)中。
對主鍵約束的更改可由相關(guān)表中的外鍵約(′?_?`)束???檢查。
外鍵約束(foreign key)就是表與表之間的某種約定的關(guān)系??,由于這種關(guān)系的存在,我們能夠讓表與表(′_`)之間的數據,更加的完整,關(guān)連性更強。
關(guān)于數據表的完整性和關(guān)連性,可以舉個(gè)例子
有二張表,一張是用戶(hù)表,一張是訂單表:
2.如果我在訂單表里面,隨便插??入了一條數據,這個(gè)訂單在用戶(hù)表里面,沒(méi)有與之對應的用戶(hù)。這樣數據也不完整了。
如(ru)果有外鍵的話(huà),就??方便多了,可以不讓用戶(hù)刪除數據,或者刪除用戶(hù)的話(huà),通過(guò)外鍵同樣刪除訂單表里面的數據,(′-ι_-`)這樣也能讓數據完整。
通過(guò)外鍵約束,每次插入或更新數據表時(shí),都會(huì )(hui)檢查數據的完整性。
2.創(chuàng )建外鍵約束
2.1 方法一:通過(guò)create table創(chuàng )建外鍵
語(yǔ)法:
create table 數據表名稱(chēng)(
...,
[CONSTRAINT [約束名稱(chēng)]] FOREIGN KEY [外鍵字段]
REFERENCES [外鍵表名??](外鍵字段,外鍵字段2?…..)
[ON DELETE CASCADE ]
[ON UPDATE CASCADE ]
)
參數的解(jie)釋?zhuān)?/p>
RESTRICT: 拒絕對父表的刪除或更新操作(zuo)。
CASCADE: 從父表刪除或更新且自動(dòng)刪除或更新子表中匹配的??行。ON DELETE CASCADE和ON UPDATヾ(′?`)?E CASCA(◎_◎;)DE都可用
注意: on up??date cascade是級聯(lián)更新的意思,on del?et??e cascade是級聯(lián)刪除的意思,意思就是說(shuō)當你更新或刪除主鍵表,那外鍵表也會(huì )跟隨一起更新或刪除。
精簡(jiǎn)化后的語(yǔ)法:
foreign key 當前表的字段 references 外部表名 (關(guān)聯(lián)的字段) type=innodb
2.1.1 插入測試數據
例子:我們創(chuàng )建一個(gè)數據庫,包含用戶(hù)信息表和訂??單表
MariaDB [book]> create?? database market; # 創(chuàng )建market數據庫
Query OK, 1 row aff??ected (0.00 sec)
MariaDB [book]> use market; # 使用market數據庫
Database changed
MariaDB [market]> create table userprofile(id int(11) not null auto_increment, name varchar(50) not null default '', sex int(1) not null default '0', pr(′?`*)imary key(id))ENGINE=innodb; # 創(chuàng )建userprofile數據表,指定使用innodb引擎
Query OK, 0 rows af??fected (0.07 sec)
MariaDB [mar(′;д;`)ket]&(?????)gt; create table user_order(o??_id int(11) auto_increment, u_id int(11) default '0', username varcha??r(50), money int(11), primary key(o_id), index(u_id), foreign key order_f_key(u_id) references userprofile(id) on delete cascade on update cascade); # 創(chuàng )建user_order數據表,同時(shí)為user_order表的u_id字段做外鍵約??束,綁定userprofile表的id字段
Query OK, 0 rows affected (0.04 sec)
MariaDB [market]> in??sert into userprofile(name,sex)values('HA',1),('LB',2),('H??PC',1); # 向userprofile數據表插入三條記錄
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
MariaDB [market]> sel(?????)ect * from userprofile; # 查詢(xún)userprofile數據表的所有記錄
+----+------+----??-+
| id | name | sex |
+----+-??-----+-----+
| 1 | HA | 1 |
| 2 | LB | 2 |
| 3 | HPC | 1 |
+----+------+-----+
3 rows in set (0.00 sec)
MariaDB [market]> insert into user_order(u_id,username,money)va( ?ヮ?)lues(1,'HA',234),(2,'LB',146),(3,'HPC',256); # 向user_order數據表插入(′?_?`)三條記錄
Query OK, 3 rows affected (0???.02 sec)
Rec??ords: 3 Duplicates:(′▽?zhuān)?) 0 Wa??rnings: 0
MariaDB(°ロ°) ! [marke??t]> select * from user_order; # 查詢(xún)user_order數據表的所有記錄
+------+------+----------+-------+
| o_id | u_id | username | money |
+------+------+----------+-------+
| 1 | 1 | HA | 234 |
| 2 | 2 | LB | 146 |
| 3 | 3 | HPC | 256 |
+------+------+----------+-------+
3 rows in set (0.00 sec)
MariaDB [market]> select(T_T) id,name,sex,money,o_id from userprofile,user_order where id=u_id; # 聯(lián)表查詢(xún)
+---??-+------+-----+-------+------+
| id | name | sex | money | o_i(O_O)d |
+----+------+-----+-------+------+
| 1 | HA | 1 | 234 | 1 |
| 2 | LB | 2 | 146 | 2 |
| 3 | HPC | 1 | 256 | 3 |
+----+------+-----+----(′▽?zhuān)?---+------+
3 rows in set (0.03 sec)??
2.1.2 測試級聯(lián)刪除
MariaDB [market]> deヽ(′▽?zhuān)?ノlete from userprofile where id=1; # 刪除user表中id為1的數據
Query OK, 1 row affected (0.01 sec)
MariaDB [market]> select id,name,sex,money,o_id from userprofile,us??er_order where id=u_ヽ(′ー`)ノid;
+----+------+-----+-------+------+
| id | name | sex | money | o_id |
+----+------+-----+-------+??------+
| 2 | LB | 2 | 146 | 2 |
| 3 | HPC | 1 | 256 | 3 |
+----+------+-----+-------??+------+
2 rows in set (0.00 sec)
MariaDB [market]> select * from user_order; # 查看ord(╯°□°)╯︵ ┻━┻er表(biao)的數據
+------+------+----------+-----??--+
| o_id | u_id | username | mo??ney |
+------+------+----------+-----(′?_?`)--+
|┐(′?`)┌ 2 | 2 | LB | 146 |
| 3 | 3 | HPC | 256 |
+------+------+----------+-------+
3 rows in set (0.00 sec)
2.1.3 測試級聯(lián)更新
更新數據之前的狀態(tài)
MariaDB [market]> select * from userprofile; # 查看userprofile表的數據
+----+------+-----+
| id | name | sex |
+----+------+-----+
| 2 | LB | 2 |
| 3 | HPC | 1 |
+-??---+------+--??---+
3 rows in set (0.00 sec)
MariaDB [market]> select * from user_order; # 查看order表的數據(ju)
+------+------+----------+-------+
| o_id | u_id | username | money |
+------+??------+----------+-------+
| 2 | 2 | LB | 146 |
| 3 | 3 | HPC | 256 |
+------+------+----------+-------+
3 rows in set (0.00 sec)
MariaDB [market]> update user??profile set id=6 where id=2; # 把u??serprofile數據表中id為2的用戶(hù)改為id為6
Query OK, 1 row affected (0.02 sec)
Rows matched: 1 Changed: 1 Warnings: 0
更新數據后的狀態(tài)
MariaDB [market]> select id,name,sex,money,o_id from userprofile,us(╯°□°)╯er_order where id=u_id; # 聯(lián)表查詢(xún),可以看出表中已經(jīng)沒(méi)(′_ゝ`)有id為2的用戶(hù)了
+----+------+-----+-------+------+
| id | name | sex | money | o_id |
+----+------+-----+-----ヾ(′?`)?--+------+
| 6 | LB | 2 | 146 | 2 |
| 3 | HPC | 1 | 256 | 3 |
+--(???)--+------+-----+-------+------+
2 rows in(???) set (0.00 sec)
MariaDB [market]> select * from userprofi??le;(′?ω?`) # 查看userprofile表的數據,id只剩下3和6
+----+------+-----+
| id | name | sex |
+----+------+-----+
| 3 | HPC | 1 |
| 6 | LB | 2 |
+----+------+-----+
2 rows in set (0.00 sec)
MariaDB [market]> select * from user_order; # 查看(°ロ°) !user_order表的數據,u_id也改為6
+------+------+----------+-------+
| o_id | u_id | username | money |
+------+------+----------+-------+
| 2 | 6 | LB | 146 |
| 3 | 3 | HPC | 256 |
+------+------+----------+-------+
2 rows in set (0.00 sec)
2.1.??4 測試數據完整性
MariaDB [market]> inserヽ(′▽?zhuān)?ノt into user_order(u_id,username,money)values(5,"XJ",345); # 單獨向user_order數據表中插入數據,插入數據失敗
ERROR 1452 (23000): Canno(′_ゝ`)t add or update a ch┐(′ー`)┌ild row: a foreign key constraint fails (`market`.`user??_order`, CON(?????)STRAINT `user_order_ibfk_1`?? FOREIGN KEY (`u_id`) REFERENCES `usヽ(′▽?zhuān)?ノerprofile` (`id`) ON DELETE CASCADE ON UPDATE CA???SCADE)
在??上面的(╯°□°)╯︵ ┻━┻例子中,user_order表的外鍵約束,user_order表受userprofile表的約束
在user_order里面插入一條數據u_id為5用戶(hù),在userprofile表里面根本沒(méi)有,所以插入數據失敗
MariaDB [market]> insert into userprofile values(5,"XJ",1); # 先向userprofile數據表中插入id為5的記錄,插入數據成功
Query OK, 1 row affected (0.01 sec)
MariaDB [market]> insert into user_order(u_id,username,m(??-)?oney) values(5,"XJ??",345); # 再向user_order數據表中插入數??據,成功
Quer??y OK, 1 row affected (0.00 sec)
MariaDB [ma??rket]&??gt; select * from userprofile; # 查詢(xún)userprofile數據表中的所有記錄
+----+------+-----+
| id | nam??e | sex |
+----+------+--(???)---+
| 3 | HPC | 1 |
| 5 | XJ | 1 |
| 6 | LB | 2 |
+----+------+-----+
3 rows in set (0.00 sec)
MariaDB [market]> select * from user_order; # 查詢(xún)user_order數據表中的所有記錄
+------+------+-(′?_?`)---------+-------+
| o_id | u_id | username | money |
+------+------+----------+-------+
| 2 | 6 | LB | 146 |
| 3 | 3 | HPC | 256 |
| 5 | 5 | XJ | 345 |
+---(′_ゝ`)---+------+----------+-------+
3 rows in set (0.01 sec)
2.2 方法二:通過(guò)alter table創(chuàng )建外鍵和級聯(lián)更新,級聯(lián)刪除
語(yǔ)法:
alter table 數據表名稱(chēng) add
[constraint [約束名稱(chēng)??] ] fo??rei(′▽?zhuān)?)gn key (外鍵字段,..)(′?_?`) references 數據表(參照字段,...)
[on update cascad??e|set null|no action]
[(′?_?`)on delete cascade|set null|no action]
)
例子:
MariaDB [market]> create table user_order1(o_id int(11) auto_increment,u_id int(11)(′?ω?`) default "0",ˉ\_(ツ)_/ˉusername varchar(50),money int(11),primary key(o_id),index(u_id)); # 創(chuàng )建user_??order1數據表,創(chuàng )建表時(shí)不使用外鍵約束
Query OK, 0 rows affecte??d (0.11 sec)
MariaDB [market]> show creat??e table user_order1; # 查看user_order1數據表的創(chuàng )建信息,沒(méi)有外鍵約束
+-------------+---------------------------------------------------------------------------------------------------------------------------??-------------------------??------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------------+------------??---------------------------------------------(???)------------------------------------------------??-----------------------------------------------------------(′▽?zhuān)?)--------------------------------------------------------------------------------------------------------------------------------------------+
| user_order1 | CREATE TABLE `user_order1` (
`o_id` int(11) NO(°o°)T NULL AUTO_INCREMENT,
`u_id` int(11??) DEFAULT '0',
`username` varchar(50) COLL??ATE utf8_unicode_ci DEFAULT NULL,
`money` int(11) DEFAULT NULL,
PRIMARY KEY (`ヽ(′▽?zhuān)?ノo_id`),
KEY `u_id` (`u_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_u??nicode_ci |
+-------------+-------------------------------(⊙_⊙)----------------------------------------------------------------------------------------------(??-)?-------------------------------------------------------------??----------??---------------------------------------------------(′?ω?`)---------------------------------------------------------+
1 row in set (0.01 sec)
MariaDB [m(′?`)arket]> alter table user_order1 add foreign key(u_id) re(°ロ°) !ferences??(′?_?`) userprofile(id) on delete cascade on update cascade; # 使用alter修改user_order1數據表(′?_?`),為user_order1數據表添加外鍵約束
Query OK, 0 rows affected (0.05 sec)
Records:ヾ(′▽?zhuān)?? 0 Duplicates: 0 Warnings: 0
MariaDB [market]> show create table user_order1; # 查看user_order1數據表的創(chuàng )建信息,已經(jīng)添加了外鍵約束
+---??----------+---------------------------------??-----------------------------------------------??---------------------------------------------------------------------------??-------(′-ι_-`)--------------??-------------------------------------------------------------?-------------------------------------------------------------------------------------------------------(????)----------------------(′▽?zhuān)?------------------------------------------------------------------+
| Table | Create Ta(′▽?zhuān)?ble |
+??-------------+-------------------------------??-----------------------------------------------------------------??-----------------??-----------------------------------------(′▽?zhuān)?----------------------------------------------------------------------------------------------------------------------------------------------------------------------------(′ω`*)-----------------------------------------------??-------------------??------------------------------------+
| user_order1 | CREATE TABLE `user_order1` (
`(╯‵□′)╯o_id` int(11) NOT NULL AUTO_INCREMENT,
`u_i??d` int(11) DEFAULT '0',
`username` varchar(50) COLLATE utf8_unic??ode_ci DEFAULT NULL,
`money` int(11) DEFAULT?? NULL,
PRIMAR??Y KEY (`o_id`),
KEY `u_id` (`u_(′?_?`)id`),
CONSTRAI(???)NT `user_order1_ibfk_1` FOREIGN KEY (`u_id`) REFERENCES `userprofile` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |
+-------------+--------------------------------------??--------------------------------------------------??------??------??-----------------( ?° ?? ?°)------------------------------------??----------------------------------------------------------------------------------------------------------------------------------------------??-------------------------------------------------------??--------------------------------------------------------??--------??--------------+
1 row in set (0.00?? sec)
3.刪除外鍵
語(yǔ)法
alter table 數據表名稱(chēng) drop foreign key 約束(外鍵(′?_?`))名稱(chēng)
例子:
MariaDB [market]> show create table user_order1; # 查看user_order1數據表??的創(chuàng )建信息,包含外鍵約束
+------------ヽ(′ー`)ノ-+----------??--------ヾ(′?`)?-??-----ヾ(′▽?zhuān)??------------------------------------??----------------------------------(′;д;`)-----------------------??---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------??-----------------------------??--??---------------------------------------------------------------(′?_?`)----------------------------+
| Table | Create Table |
+------------(′_ゝ`)-+--------------------------------------------------(′▽?zhuān)?------??-------------------(°□°)-----------------------------------------(′?`)-------------------------------------------------??---------------------------------------------------------------------------ヾ(?■_■)ノ------(′?`*)-----------------------------------------------------------------------------------------( ?▽?)-------(′?`*)--------------------------------------------------------------------------------------+
| user_order1 | CREATE TABLE `user_order1` (
`o_i??d` int(11) NOT NULL AUTO_INCREMENT,
`u_id` int(11) DEFAULT '0',
`username` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
`money` int(11) DEFAULT NULL,
PRIMARY KEY (`o_id`),
KEY `u_id` (`u_id`),
CONSTRAINT `user_order1_ibfk_1` FOREIGN KEY (`u_id`) REFERENCES `userprofile` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAヽ(′?`)ノULT CHARSET=utf8 COLLATE=utf8_unicode_ci |
+-------------+------------??-------------------------------------(′▽?zhuān)?----------------------------------------------------------------------------( ?° ?? ?°)----------------------------------------------------------------------------------------------------------------------(′ω`)---------?--------------------------------------------------------??------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
Mari??aDB [market]> alter table user_order1? drop foreign key user_order1_ibfk_1; # 為use(◎_◎;)r_order1數據表刪除外鍵約束,外鍵名稱(chēng)必須與從`show create table user_order??1`語(yǔ)句中查到的相同
Query OK, 0 rows affected (0.05 sec)
Records: 0 Duplicates: 0 Warnings: 0
MariaDB [market]> show create table user_order1; # 查看user_??order1數據表的創(chuàng )建信息,外鍵約束已經(jīng)被刪除了
+-------------+----------------------------------------------------(′ω`*)-------------------------(╬?益?)-------------------------------(′;ω;`)-------ヽ(′▽?zhuān)?ノ---------------------------??---------------------------------------------------------------------------------------------ヽ(′?`)ノ-(′;д;`)-------------------??(′?`)-------------------------------------------------+
| Table | Create Table |
+-------??------+---------------------------------------------------(′?_?`)-----------------------------------------------------------------??--------------------------------------------------------------------------------------------------??--------------------------??----------------------------------------------------------------+
| user_order1 | CREATE TABLE `user_order1` (
`o_id` int(11) NOT NULL AUTO_INCREMENT,
`u_id`(╬ ò﹏ó) int(11) DEFAULT '0',
`username` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
`money`?? int(11) DEFAULT NULL,
PRIMARY KEY (`o_id`),??
KEY `u_id` (`u_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utヾ(?■_■)ノf8_unicode_ci |
+-------------+-------???-----------------------------------------------(′?_?`)-------------------------------------------------------------(′-ι_-`)------------------??--------------(′▽?zhuān)?----------------------------------------(╯‵□′)╯------------------??-----ヽ(′?`)ノ-----ヾ(′ω`)?------------------------------??-----??------------------------------------------------------+
1 row in set (0.00 sec)
4.使用外鍵約束的條ヽ(′▽?zhuān)?ノ件
要想外鍵創(chuàng )建成功,必須滿(mǎn)足以下4個(gè)條件:
1、確保參照的表和字段存在。
2、組成外鍵的字段被索引。
3、必(bi)須使用type指定存儲引擎為:innodb.
4、外鍵字段和關(guān)聯(lián)字段,數據類(lèi)型必須一致。
5.使用外鍵約束需要的注意事項
1.on de??lete cascade on update cascade 添加級聯(lián)刪除和更新:
2.確保參照的表userp??rofile中id??字段存在。
3.確保組成外鍵的字段u_id被索引
4.必須使用type指定存儲引擎為:innodb。
5.外鍵字段和關(guān)聯(lián)字段,數據類(lèi)??型必須一致。
總結
以上就是這篇文章的??全部?jì)热萘?,希望本文的內容對大家的學(xué)習或者工作具有一定(′ω`*)的ヽ(′ー`)ノ參考學(xué)(′ω`)習價(jià)值,如果有疑問(wèn)(wen)大(da)家可以留言交流,謝謝大家對腳本之家的支持。
來(lái)源:腳本之家
鏈接:https://www.jb51.net/article/146??(′?`*)817.htm
友情鏈接:
蕭山慕媛網(wǎng)絡(luò )科技有限公司西安海碼網(wǎng)絡(luò )科技有限公司義烏士圓網(wǎng)絡(luò )科技有限公司北票迎界網(wǎng)絡(luò )科技有限公司龍口潤正網(wǎng)絡(luò )科技有限公司濮陽(yáng)鼎財網(wǎng)絡(luò )科技有限公司昆明久霸網(wǎng)絡(luò )科技有限公司西寧南源網(wǎng)絡(luò )科技有限公司石獅時(shí)士網(wǎng)絡(luò )科技有限公司高郵濤用網(wǎng)絡(luò )科技有限公司榆次艾達網(wǎng)絡(luò )科技有限公司長(cháng)沙洋迪網(wǎng)絡(luò )科技有限公司
© 2013-2025.Company name All rights reserved.網(wǎng)站地圖 天津九安特機電工程有限公司-More Templates