mysql外鍵的使用

一早就知道有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 [默認]

具體的使用還須要本身多測試多使用就能理解了,其實外鍵也不難搞懂,只是接觸的少了。平時的代碼中實現這一類邏輯基本是用代碼去實現的,因此通常不會用到外鍵。那麼外鍵的優點和劣勢在哪裏,這個估計要親身體驗才能知道了吧,

相關文章
相關標籤/搜索