关于MySQL 外键索引

来源:互联网 发布:js获取fileupload路径 编辑:程序博客网 时间:2024/06/06 20:32

1、什么时候需要用到外键索引呢?

答:A表中存在唯一索引id_a,B表中的字段包含id_a,由于B表自身已经有主键索引,此时如果将字段id_a设置为外键索引索引(foreign key),则建立外键索引。

使用场景:

1)父表更新时,子表也更新;父表删除时,如果

2)子表有匹配的项,则删除失败。

(3)父表更新时,子表也更新;父表删除时子表匹配的项也删除。

即:使用外键可以使得修改或者删除的级联操作的日常维护工作更加轻松。

 

2、创建语法

[CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name, ...) REFERENCES tbl_name(index_col_name,...) [ON DELETE reference_option] [ON UPDATE reference_option]

reference_option:

RESTRICT | CASCADE | SET NULL | NO ACTION

(外键值最直接的作用)如果子表试图创建一个父表不存在的外键值,InnoDB会拒绝任何INSERT或者UPDATE操作。

如果父表试图UPDATE或者DELETE任何子表中存在或匹配的外键值,最终动作取决于外键约束定义中的ON UPDATE和ON DELETE选项。

InnoDB支持以下几种动作类型,如果没有指定ON DELETE或者ON UPDATE,默认的动作为RETRICT:

(1)CASCADE:顾名思义:级联,从父表中删除或者更新对应的行,同时自动的删除或者更新子表中匹配的行。如:ON DELETE CANSCADE和ON UPDATE CANSCADE。(最有用

(2)SET NULL:从父表中删除或更新对应的行,同时将子表中的外键列设置为空。注意,这些在外键列没有被设为NOT NULL时才生效。如:ON DELETE SET NULL和ON UPDATE SET NULL。

(3)NO ACTION:

(4)RESTRICT:拒绝删除或者更新父表。(默认

举个栗子:

建立表province:

CREATE TABLE `province` (

  `id` smallint(6) NOT NULL AUTO_INCREMENT,

  `name` varchar(10) COLLATE utf8_bin NOT NULL,

  PRIMARY KEY (`id`)

)ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_bin ;

建立表student:

CREATE TABLE `student` (

  `id` smallint(6) NOT NULL AUTO_INCREMENT,

  `name` varchar(10) COLLATE utf8_bin NOT NULL,

  `pid` smallint(6) DEFAULT NULL,

  PRIMARY KEY (`id`),

  KEY `pik_fk` (`pid`),

  CONSTRAINT `pik_fk` FOREIGN KEY (`pid`) REFERENCES `province` (`id`) ON DELETE CASCADE ON UPDATE CASCADE

)ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

上述student表中已经建立了外键级联索引(包括delete cascade 和 update cascade)

这里,先介绍下如何删除外键索引:可以看到建立外键索引产生了两个属性一个是字段pid被设置为索引,而且还加了一个约束属性。

删除的操作:

(1)dorp table student drop foreign key pik_fk;

(2)drop table student drop key pik_fk;

注意:需要分别执行两次pik_fk的操作。

执行上述操作之后,表结构如下:

CREATE TABLE `student` (

  `id` smallint(6) NOT NULL AUTO_INCREMENT,

  `name` varchar(10) COLLATE utf8_bin NOT NULL,

  `pid` smallint(6) DEFAULT NULL,

  PRIMARY KEY (`id`)

)ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

需求一:现在需要增加一个外键索引,当该外键对应的父表删除掉主键id,则对于的该表中关联的字段也要一起删除掉。增加如下:

alter table student add constraint pid_fk foreign key (pid) references province (id) on delete cascade on update cascade;

则添加外键索引:

CREATE TABLE `student` (

  `id` smallint(6) NOT NULL AUTO_INCREMENT,

  `name` varchar(10) COLLATE utf8_bin NOT NULL,

  `pid` smallint(6) DEFAULT NULL,

  PRIMARY KEY (`id`),

  KEY `pid_fk` (`pid`),

  CONSTRAINT `pid_fk` FOREIGN KEY (`pid`) REFERENCES `province` (`id`) ON DELETE CASCADE ON UPDATE CASCADE

)ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

此时,如果执行删除province中某条记录,则会删除student中所有有关联该条记录主键的记录。如果更新province中主键id,则会更新所有student中原有表对应的外键id。

需求二:如果删除各province中的主键id,则student中中外键pid将相应更改为null。

alter table student add constraint pid_fk foreign key (pid) references province (id) on delete set null on update set null;

需求三:如果province中的主键id在student中外键pid中存在,则不允许进行删除和更改操作。

alter table student add constraint pid_fk foreign key (pid) references province (id) on delete RESTRICT on update RESTRICT;

外键索引的缺点:

由于加了约束,因此操作变慢了。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 写作文没有拿稿纸怎么办? 纬创面试英语差怎么办 wifi只有两个人连很差怎么办 孩子写作文老是离体怎么办 高一语文阅读理解不好怎么办 80后90后中国怎么办 小学生毕业了班级家长微信群怎么办 ppt做了没保存怎么办 在中考中作文写在抄镐纸上怎么办 ppt格式刷隐藏了怎么办 ps卡住不动弹了怎么办 画图工具压缩完照片后有白边怎么办 穿滑校服就想自慰怎么办 绿地球叶子变干怎么办 有异物掉入眼中怎么办 有异物掉入眼中应怎么办 有异物掉入眼睛怎么办 空调出风口掉入异物怎么办? 超星尔雅挂科了怎么办 泰拉瑞亚神庙祭坛挖掉了怎么办 泰拉瑞亚不小心把数据删除了怎么办 足球守门员遇到单刀球怎么办 猫见到主人就跑怎么办 手机玩游戏闪屏怎么办 满身起小疙瘩很痒怎么办 出门在外忘记带备用胸罩怎么办 去泰国浮潜近视怎么办 gta5线上马丁任务卡了怎么办 双肩背包黑色的皮子褪色怎么办 lspdfr在游戏里崩溃怎么办 gta5钱超过21亿怎么办 假警察要带走我怎么办 遇到假警察拦车怎么办 大连船员体检眼力不合格怎么办 禁行如果通过了怎么办 钻戒的戒圈磨损怎么办 多肉的肉掉了怎么办 电脑自带鼠标动不了怎么办 笔记本电脑自带鼠标动不了怎么办 包包弹簧扣松了怎么办 耳钉氧化成黑色怎么办