MySQL利用外键实现级联操作

转载 2016年08月31日 16:52:18

MySQL中利用外键实现级联删除、更新

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

MySQL 外键实现级联操作

MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引。在创建索引的时候,可以指定在删除、更新父表时,对子表进行的相应操作...

Day40-Hibernate03(多表操作、配置多表关系、级联、放弃外键维护权)

Hibernate03(多表操作、配置多表关系、级联、放弃外键维护权)
  • jjizh
  • jjizh
  • 2017-07-31 16:54
  • 277

如何设置主键和外键,实现级联更新、级联删除

主键、外键和索引的区别?   主键 外键 索引 定义: 唯一标识一条记录,不能有重复的,不允许为空 表的外键是另一表的主键, 外键可以有重复的, 可以是空值 该字段...

【Mysql】外键级联与级联的劣势

在建表的时候时候,可以对于删除delete、修改update设置为级联。用一个例子先说明外键级联级联的概念 假如数据库中本以存在一张usertable如下: 此user表非常简单,id为主...

在MySQL中利用外键实现级联删除!

本文转自:点击打开链接 作者:Dirk (dirk.ye AT gmail.com) Url:http://dirk.pdx.cn 日期:2004/12/08 首先...

MySQL中利用外键实现级联删除、更新

MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引。在创建索引的时候,可以指定在删除、更新父表时,对子表进行的相应操作...
  • dodott
  • dodott
  • 2015-08-27 11:03
  • 3327

简简单单说外键和级联

外键 定义作用主表和从表建键原则事件触发限制 外键简单实例触发器实现 建表语句关系说明实现级联删除 更改设置实现总结 文首         今天给考试系统添加学生信息失败,原因...

Oracle外键级联删除和级联更新

1 级联删除 Oracle在外键的删除上有NO ACTION(类似RESTRICT)、CASCADE和SET NULL三种行为。 下面以学生-班级为例说明不同情况下的外键删除,学生属于班级,班级的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)