您好,登錄后才能下訂單哦!
小編給大家分享一下MySQL中的外鍵作用是什么,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!
MySQL外鍵的作用:
保持數(shù)據(jù)一致性,完整性,主要目的是控制存儲在外鍵表中的數(shù)據(jù)。使兩張表形成關(guān)聯(lián),外鍵只能引用外表中列的值!
我們來建兩個表
CREATE TABLE `example1` ( `stu_id` int(11) NOT NULL DEFAULT '0', `course_id` int(11) NOT NULL DEFAULT '0', `grade` float DEFAULT NULL, PRIMARY KEY (`stu_id`,`course_id`) ); CREATE TABLE `example2` ( `id` int(11) NOT NULL, `stu_id` int(11) DEFAULT NULL, `course_id` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `f_ck` (`stu_id`,`course_id`), CONSTRAINT `f_ck` FOREIGN KEY (`stu_id`, `course_id`) REFERENCES `example1` (`stu_id`, `course_id`) ); insert into example1 (stu_id,course_id,grade)values(1,1,98.5),(2,2,89); insert into example2 (id,stu_id,course_id)values(1,1,1),(2,2,2);
我們建了
example1表,里面包含stu_id學號,course_id課程號,grade分數(shù)
example2表,里面包含id,stu_id學號,course_id課程號,然后建立外鍵
分別插入數(shù)據(jù)到兩個表中。
我們把example2中的stu_id和course_id稱為example2表的外鍵,example1是父表,example2是字表,兩個表形成關(guān)聯(lián),必須字表的數(shù)據(jù)刪除后,才能刪除父表中的對應(yīng)數(shù)據(jù)
現(xiàn)在我們來刪除example1中的一條數(shù)據(jù)
delete from example1 where stu_id=2;
會發(fā)現(xiàn)報錯
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`test`.`example3`, CONSTRAINT `f_ck` FOREIGN KEY (`stu_id`, `course_id`) REFERENCES `example2` (`stu_id`, `course_id`))
因為example2中的數(shù)據(jù)關(guān)聯(lián)了example1的數(shù)據(jù),這樣是刪不了的,達到了外鍵的作用;
然后我們來先刪除example2表中的數(shù)據(jù),再刪除example1表中的數(shù)據(jù)
delete from example2 where stu_id=2;
delete from example1 where stu_id=2;
這樣就成功了;
事件觸發(fā)限制:
on delete和on update , 可設(shè)參數(shù)cascade(跟隨外鍵改動), restrict(限制外表中的外鍵改動),set Null(設(shè)空值),set Default(設(shè)默認值),[默認]no action
我們來看看事件觸發(fā)限制是干嘛的。。。
我們先刪除外鍵,然后重新建立外鍵帶上事件觸發(fā)限制
alter table example2 drop foreign key f_ck; alter table example2 add CONSTRAINT `f_ck` FOREIGN KEY (`stu_id`, `course_id`) REFERENCES `example1` (`stu_id`, `course_id`) ON DELETE CASCADE ON UPDATE CASCADE;
我們先查看一下數(shù)據(jù)
mysql> select * from example1;select * from example2;
+--------+-----------+-------+ | stu_id | course_id | grade | +--------+-----------+-------+ | 1 | 1 | 98.5 | +--------+-----------+-------+ 1 row in set (0.00 sec) +----+--------+-----------+ | id | stu_id | course_id | +----+--------+-----------+ | 1 | 1 | 1 | +----+--------+-----------+ 1 row in set (0.00 sec)
這時example1和example2中的stu_id和course_id都是1,
再來修改example1表中的數(shù)據(jù)看看
update example1 set stu_id=3,course_id=3 where stu_id=1;
再來查看數(shù)據(jù)
mysql> select * from example1;select * from example2;
+--------+-----------+-------+ | stu_id | course_id | grade | +--------+-----------+-------+ | 3 | 3 | 98.5 | +--------+-----------+-------+ 1 row in set (0.00 sec) +----+--------+-----------+ | id | stu_id | course_id | +----+--------+-----------+ | 1 | 3 | 3 | +----+--------+-----------+ 1 row in set (0.00 sec)
發(fā)現(xiàn)沒,example1和example2中的stu_id和course_id都變成了3
我們在來刪除example1表中的數(shù)據(jù)
delete from example1 where stu_id=3;
會發(fā)現(xiàn)可以刪除,而且example2中的數(shù)據(jù)也沒有了;
其實啊,外鍵就這個作用,保持數(shù)據(jù)一致性,完整性,是不讓改還是一起改,由事件觸發(fā)器決定;
看完了這篇文章,相信你對MySQL中的外鍵作用是什么有了一定的了解,想了解更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。