一早就知道有mysql有外鍵這回事,可是貌似平時的項目中用到的並很少,以致於我沒有去研究過這個東西,也不知道該怎麼用。固然也不清楚對性能的影響。這篇文章先搞清楚外鍵的做用。mysql
首先來添加一張表,作爲測試要用的一張參考表。sql
CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `sex` tinyint(4) DEFAULT NULL, `create_time` datetime DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
接着建一張包含外鍵的表。性能
CREATE TABLE `user_article` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) DEFAULT NULL, `content` varchar(255) DEFAULT NULL, `create_time` datetime DEFAULT NULL, `modify_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), KEY `user_id` (`user_id`), CONSTRAINT `user_article_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
接着就測試一下外鍵的做用。分別在user表和user_article表建立一點數據。測試
user表
id | name | sex | create_time |
---|---|---|---|
1 | admin | 1 | 2016-09-08 16:36:55 |
2 | xiaoming | 2 | 2016-09-08 16:37:07 |
user_article表
id | user_id | content | create_time | modify_time |
---|---|---|---|---|
1 | 1 | hello word | 2016-09-08 16:39:11 | NULL |
如今目的是要保持user表和user_article表的數據完整性,因此在刪除user的時候,若是user_article存在數據的話,那麼禁止刪除。user表和user_article表是經過user_id關聯的。在建表的時候就已經爲user_article表的user_id字段創建了外鍵,參考欄位就是user表的id,更新和刪除時選項都爲 RESTRICT。rest
如今我運行刪除語句 delete from user where id=1;
會報以下錯誤:code
Cannot delete or update a parent row: a foreign key constraint fails (`test`.`user_article`, CONSTRAINT `user_article_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`))
由於在user_article中存在user_id爲1的數據,因此這裏禁止參考表刪除這條數據。io
更新和刪除時的選項能夠根據本身的實際狀況進行修改,下面是更新和修改時的觸發機制:table
on delete和on update , 可設參數:
cascade(跟隨外鍵改動)test
restrict(限制外表中的外鍵改動)date
set Null(設空值)
set Default(設默認值)
no action [默認]
具體的使用還須要本身多測試多使用就能理解了,其實外鍵也不難搞懂,只是接觸的少了。平時的代碼中實現這一類邏輯基本是用代碼去實現的,因此通常不會用到外鍵。那麼外鍵的優點和劣勢在哪裏,這個估計要親身體驗才能知道了吧,