MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引。在创建索引的时候,可以指定在删除、更新父表时,对子表进行的相应操作,包括RESTRICT、NO ACTION、SET NULL和CASCADE。其中RESTRICT和NO ACTION相同,是指在子表有关联记录的情况下父表不能更新;CASCADE表示父表在更新或者删除时,更新或者删除子表对应记录;SET NULL则是表示父表在更新或者删除的时候,子表的对应字段被SET NULL。

因为只有InnoDB引擎才允许使用外键,所以,我们的数据表必须使用InnoDB引擎。我所使用的版本是Mysql5.1版本的,过程如下:

创建数据库:

Create database test;

创建两个表,其中第一个表的”id”是第二个表(userinfo)的外键:

CREATE TABLE `user` (

`id` int(4) NOT NULL,

`sex` enum('f','m') DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `userinfo` (

`sn` int(4) NOT NULL AUTO_INCREMENT,

`userid` int(4) NOT NULL,

`info` varchar(20) DEFAULT NULL,

PRIMARY KEY (`sn`),

KEY `userid` (`userid`),

CONSTRAINT `userinfo_ibfk_1` FOREIGN KEY (`userid`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE

) ENGINE=InnoDB DEFAULT CHARSET=latin1;

注意:1、存储引擎必须使用InnoDB引擎;2、外键必须建立索引;3、外键绑定关系这里使用了“ ON DELETE CASCADE ” “ON UPDATE CASCADE”,意思是如果外键对应数据被删除或者更新时,将关联数据完全删除或者相应地更新。更多信息请参考MySQL手册中关于InnoDB的文档;好,接着我们再来插入数据测试:

INSERT INTO `user` (`id`,`sex`)

VALUES ('1', 'f'), ('2', 'm'), ('3', 'f');

INSERT INTO `userinfo` (`sn`,`userid`,`info`)

VALUES ('1', '1', '2005054dsf'),

('2', '1', 'fdsfewfdsfds'),

('3', '1', 'gdsgergergrtre'),

('4', '2', 'et34t5435435werwe'),

('5', '2', '435rtgtrhfghfg'),

('6', '2', 'ret345tr4345'),

('7', '3', 'fgbdfvbcbfdgr'),

('8', '3', '45r2343234were'),

('9', '3', 'wfyhtyjtyjyjy');

我们先看一下当前数据表的状态:

mysql> show tables;

+----------------+

| Tables_in_test |

+----------------+

| user |

| userinfo |

+----------------+

2 rows in set (0.00 sec)

User表中的数据:mysql> select * from user;

+----+------+

| id | sex |

+----+------+

| 1 | f |

| 2 | m |

| 3 | f |

+----+------+

3 rows in set (0.00 sec)

Userinfo表中的数据:

mysql> select * from userinfo;

+----+--------+-------------------+

| sn | userid | info |

+----+--------+-------------------+

| 1 | 1 | 2005054dsf |

| 2 | 1 | fdsfewfdsfds |

| 3 | 1 | gdsgergergrtre |

| 4 | 2 | et34t5435435werwe |

| 5 | 2 | 435rtgtrhfghfg |

| 6 | 2 | ret345tr4345 |

| 7 | 3 | fgbdfvbcbfdgr |

| 8 | 3 | 45r2343234were |

| 9 | 3 | wfyhtyjtyjyjy |

+----+--------+-------------------+

9 rows in set (0.00 sec)

对于建立以上不表,相信对大家也没什么难度了。好的,下面我们就要试验我们的级联删除功能了。我们将删除user表中id为2的数据记录,看看userinf表中userid为2的相关子纪录是否会自动删除:

执行删除操作成功!

mysql> delete from `user` where `id`='2';

Query OK, 1 row affected (0.03 sec)

看看user表中已经没有id为2的数据记录了!

mysql> select * from user;

+----+------+

| id | sex |

+----+------+

| 1 | f |

| 3 | f |

+----+------+

2 rows in set (0.00 sec)

再看看userinfo表中已经没有userid为2的3条数据记录了,对应数据确实自动删除了!

mysql> select * from userinfo;

+----+--------+----------------+

| sn | userid | info |

+----+--------+----------------+

| 1 | 1 | 2005054dsf |

| 2 | 1 | fdsfewfdsfds |

| 3 | 1 | gdsgergergrtre |

| 7 | 3 | fgbdfvbcbfdgr |

| 8 | 3 | 45r2343234were |

| 9 | 3 | wfyhtyjtyjyjy |

+----+--------+----------------+

6 rows in set (0.00 sec)

更新的操作也类似,因为我们在前面建表的时候已经定义外键删除、更新操作都是CASCADE,所以在这里可以直接测试数据。

将user表中原来id为1的数据记录更改为id为4,执行如下:

mysql> update user set id=4 where id='1';

Query OK, 1 row affected (0.03 sec)

Rows matched: 1 Changed: 1 Warnings: 0

现在去看看两个表中是数据是否发生了变化:

mysql> select * from user;

+----+------+

| id | sex |

+----+------+

| 3 | f |

| 4 | f |

+----+------+

2 rows in set (0.00 sec)

mysql> select * from userinfo;

+----+--------+----------------+

| sn | userid | info |

+----+--------+----------------+

| 1 | 4 | 2005054dsf |

| 2 | 4 | fdsfewfdsfds |

| 3 | 4 | gdsgergergrtre |

| 7 | 3 | fgbdfvbcbfdgr |

| 8 | 3 | 45r2343234were |

| 9 | 3 | wfyhtyjtyjyjy |

+----+--------+----------------+

6 rows in set (0.00 sec)

比较原来的表可以发现它们的确已经更新成功了,测试完成!!!这也就实现了用外键对多个相关联的表做同时删除、更新的操作,从而保证了数据的一致性。

mysql创建外键级联更新_MySQL中利用外键实现级联删除、更新相关推荐

  1. mysql中外键设置级联删除_MySQL中利用外键实现级联删除、更新

    MySQL中利用外键实现级联删除.更新 MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引.在 创建索引的时候,可以指 ...

  2. mysql中主键的用法_MySQL中的主键以及设置其自增的用法教程

    1.声明主键的方法:您可以在创建表的时候就为表加上主键,如: CREATE TABLE tbl_name ([字段描述省略...], PRIMARY KEY(index_col_name)); 也可以 ...

  3. mysql 外键详解_mysql 中的外键key值的详解

    如果Key是空的, 那么该列值的可以重复, 表示该列没有索引, 或者是一个非唯一的复合索引的非前导列 2. 如果Key是PRI,  那么该列是主键的组成部分 3. 如果Key是UNI,  那么该列是一 ...

  4. mysql 修改字段长度 合并语句_mysql中利用sql语句修改字段名称,字段长度等操作...

    1.修改字段的长度 语法: ALTER TABLE 表名 MODIFY COLUMN 字段名  数据类型(修改后的长度) 例子: 将字段的长度由10改为20 ALTER TABLE attence M ...

  5. mysql外键约束创建及删除_MySQL中的外键的创建,约束和删除

    一.外键的创建 语法一:后续添加方法 alter table 表名 add constraint 约束名 foreign key(当前表中约束的字段) references 主表表名(要约束的字段名) ...

  6. mysql 所有外键_mysql中的外键

    mysql中的外键 1.默认的外键存在之后,会对数据进行约束. 1)约束1:如果子表中添加的数据,外键字段对应的数据如果在父表中不存在,那么添加失败. 有数据之后: 修改:可以修改跟外键不相关的任何字 ...

  7. mysql 主外键_mysql中主外键关系

    一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性 外键:是另一表的主键, ...

  8. mysql中的foreignkey的作用_mysql中的外键foreign key

    一.如果一张表中有一个非主键的字段指向了别一张表中的主键,就将该字段叫做外键. 一张表中可以有多个外键. 外键的默认作用有两点: 1.对子表(外键所在的表)的作用:子表在进行写操作的时候,如果外键字段 ...

  9. mysql主键约束和外键约束的作用_MySQL中的主键约束和外键约束

    1.主键约束 表通常具有包含唯一标识表中每一行的值的一列或一组列. 这样的一列或多列称为表的主键 (PK),用于强制表的实体完整性. 由于主键约束可保证数据的唯一性,因此经常对标识列定义这种约束. 如 ...

最新文章

  1. python语言中如何使用注释
  2. 正则表达式中(?:)的巨大作用
  3. 浅析网页meta标签中X-UA-Compatible属性的使用
  4. 【最详细解析】1052 卖个萌 (20分)_28行代码AC
  5. 中职计算机说课稿三篇,精选中职计算机说课稿三篇-20210609060707.docx-原创力文档...
  6. linux下的C语言开发(gdb调试)
  7. jQuery的鼠标事件总结
  8. 排序——冒泡排序算法
  9. Android音频系统扫盲
  10. 如何保证集合是线程安全的? ConcurrentHashMap如何实现高效地线程安全?(转)
  11. html----选项卡自动切换以及鼠标悬停时停止(js)
  12. DirectoryEntry 对象
  13. AD15的PCB设计流程及基本设置
  14. android云控开源,Android EasyClient 云台控制开源流媒体摄像机EasyCamera
  15. video视频播放中trank标签字幕显示问题
  16. 阿里云Centos系统下部署静态前端页面
  17. WIN7常见问题与分析
  18. 小程序ios页面数据空白问题
  19. seaborn直方图、散点图与回归分析图的绘制
  20. SIGCOMM13论文简要选读

热门文章

  1. RESET MASTER和RESET SLAVE使用场景和说明,以及清除主从同步关系
  2. 使用XSLT制作HTML邮件模板并发送
  3. 用linux集成电路版图设计,集成电路版图设计教程2012版本
  4. python大数据论坛_干货 | Python+大数据计算平台,PyODPS架构手把手教你搭建
  5. 【控制】《鲁棒控制-线性矩阵不等式处理方法》-俞立老师-第10章-滤波器设计
  6. 【控制】《多智能体系统的协同群集运动控制》陈杰老师-第9章-多任务约束下多智能体协同编队控制
  7. 第二章 单变量线性回归-机器学习老师板书-斯坦福吴恩达教授
  8. 3.6 权值初始化-机器学习笔记-斯坦福吴恩达教授
  9. 北京、广东重名数量查询工具,给孩子起名重名查询
  10. ubuntu命令创建用户无法登入问题