mysql delete 级联删除_MySQL级联删除和更新
首先,目前在产品环境可用的MySQL版本(指4.0.x和4.1.x)中,只有InnoDB引擎才允许使用外键,所以,我们的数据表必须使用InnoDB引擎。
下面,我们先创建以下测试用数据库表:
CREATE TABLE `roottb` (
`id` INT(11) UNSIGNED AUTO_INCREMENT NOT NULL,
`data` VARCHAR(100) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) TYPE=InnoDB;
CREATE TABLE `subtb` (
`id` INT(11) UNSIGNED AUTO_INCREMENT NOT NULL,
`rootid` INT(11) UNSIGNED NOT NULL DEFAULT '0',
`data` VARCHAR(100) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
INDEX (`rootid`),
FOREIGN KEY (`rootid`) REFERENCES roottb(`id`) ON DELETE CASCADE
) TYPE=InnoDB;
注意:
1、必须使用InnoDB引擎;
2、外键必须建立索引(INDEX);
3、外键绑定关系这里使用了“ ON DELETE CASCADE”,意思是如果外键对应数据被删除,将关联数据完全删除,更多信息请参考MySQL手册中关于InnoDB的文档;
好,接着我们再来插入测试数据:
INSERT INTO `roottb` (`id`,`data`)
VALUES ('1', 'test root line 1'),
('2', 'test root line 2'),
('3', 'test root line 3');
INSERT INTO `subtb` (`id`,`rootid`,`data`)
VALUES ('1', '1', 'test sub line 1 for root 1'),
('2', '1', 'test sub line 2 for root 1'),
('3', '1', 'test sub line 3 for root 1'),
('4', '2', 'test sub line 1 for root 2'),
('5', '2', 'test sub line 2 for root 2'),
('6', '2', 'test sub line 3 for root 2'),
('7', '3', 'test sub line 1 for root 3'),
('8', '3', 'test sub line 2 for root 3'),
('9', '3', 'test sub line 3 for root 3');
我们先看一下当前数据表的状态:
mysql>; show tables;
+----------------+
| Tables_in_test |
+----------------+
| roottb |
| subtb |
+----------------+
2 rows in set (0.00 sec)
mysql>; select * from `roottb`;
+----+------------------+
| id | data |
+----+------------------+
| 1 | test root line 1 |
| 2 | test root line 2 |
| 3 | test root line 3 |
+----+------------------+
3 rows in set (0.05 sec)
mysql>; select * from `subtb`;
+----+--------+----------------------------+
| id | rootid | data |
+----+--------+----------------------------+
| 1 | 1 | test sub line 1 for root 1 |
| 2 | 1 | test sub line 2 for root 1 |
| 3 | 1 | test sub line 3 for root 1 |
| 4 | 2 | test sub line 1 for root 2 |
| 5 | 2 | test sub line 2 for root 2 |
| 6 | 2 | test sub line 3 for root 2 |
| 7 | 3 | test sub line 1 for root 3 |
| 8 | 3 | test sub line 2 for root 3 |
| 9 | 3 | test sub line 3 for root 3 |
+----+--------+----------------------------+
9 rows in set (0.01 sec)
嗯,一切都正常,好,下面我们要试验我们的级联删除功能了。
我们将只删除roottb表中id为2的数据记录,看看subtb表中rootid为2的相关子纪录是否会自动删除:
mysql>; delete from `roottb` where `id`='2';
Query OK, 1 row affected (0.03 sec)
mysql>; select * from `roottb`;
+----+------------------+
| id | data |
+----+------------------+
| 1 | test root line 1 |
| 3 | test root line 3 |
+----+------------------+
2 rows in set (0.00 sec)
mysql>; select * from `subtb`;
+----+--------+----------------------------+
| id | rootid | data |
+----+--------+----------------------------+
| 1 | 1 | test sub line 1 for root 1 |
| 2 | 1 | test sub line 2 for root 1 |
| 3 | 1 | test sub line 3 for root 1 |
| 7 | 3 | test sub line 1 for root 3 |
| 8 | 3 | test sub line 2 for root 3 |
| 9 | 3 | test sub line 3 for root 3 |
+----+--------+----------------------------+
6 rows in set (0.01 sec)
嗯,看subtb表中对应数据确实自动删除了,测试成功。
结论:在MySQL中利用外键实现级联删除成功!
---------------------------------------------------------------------------------------------------------------user表:
create table user
(
userid integer not null auto_increment primary key,
username varchar(12) not null
)
type=innodb;
password表:
create table password
(
userid integer not null,
password varchar(12) not null,
index (userid),
foreign key (userid) references user (userid)
on delete cascade
on update cascade
)
type=innodb;
1、MySQL支持外键约束,并提供与其它DB相同的功能,但表类型必须为 InnoDB
2、建外键的表的那个列要加上index.
mysql delete 级联删除_MySQL级联删除和更新相关推荐
- mysql如何逻辑删除_mysql逻辑删除如何恢复
在项目中,一般会遇到这种情况:逻辑删除以及多关联不删除 逻辑删除(软删除):逻辑删除就是对要被删除的数据打上一个删除标记,通常使用一个is_deleted字段标示行记录是不是被删除(或者使用一个sta ...
- mysql如何drop数据库_MySQL如何删除数据库
MySQL删除数据库的方法:1.使用drop命令删除数据库,代码为[drop database ;]:2.使用PHP脚本删除,代码为[mysqli_query(connection,query,res ...
- mysql delete in死锁_mysql 执行delete引发死锁问题
关于mysql事务引发的死锁异常解决 场景 问题 死锁日志[^2] 锁类型与隔离级别 InnerDB 锁: mysql事务 解决方案 场景 mysql 5.7 InnoDB存储引擎 jdk 8 spr ...
- mysql delete join语法_mysql之delete语法
一:DELETE语法 以往用delect删除表数据是都是单表(一个表)删除.对于关联表,往往都是先删除第一个表的数据,然后再写另一个delect语句删除另一个表的数据(浪费时间,又影响性能,与数据库交 ...
- mysql delete limit用法_mysql delete limit 使用方法详解
mysql delete limit优点: 用于DELETE的MySQL唯一的LIMIT row_count选项用于告知服务器在控制命令被返回到客户端前被删除的行的最大值.本选项用于确保一个DELET ...
- mysql 关联删除_mysql 关联删除
参考网址:http://www.111cn.net/database/mysql/51146.htm 原网页广告太多,自己抄了下. 1.delete from t1 where 条件 2.delete ...
- mysql存储过程删除_MySQL 存储过程删除大表
1.权限问题 alter routine 编辑或删除存储过程 create routine 建立存储过程 execute 创建存储过程 2.存储过程相关的一些命令 show procedure sta ...
- mysql触发器联立删除_mysql触发器删除实例1
mysql>create table t1 (a1 int);mysql>create table t2 (a2 int , b2 char(5));其中t2.a2和t1.a1是对应的,a ...
- 表名含有后缀 mysql 怎么删除_mysql批量删除指定前缀或后缀表
今天突然发现我们数据库中多出很多表,后缀名为"copy",预计是navicat直接拷贝导致的,然后要对这些有同样后缀名的表进行删除,假设一个一个选择会非常麻烦,表计较多,在网上找了 ...
最新文章
- 使用 dockerfile 创建镜像
- python-正则表达式练习题
- java如何配置环境_java如何配置环境变量
- HashMap源代码深入剖析
- Linux命令之hexdump - ”十六“进制查看器
- ORACLE的分布式管理
- mfc实验报告心得体会_mfc实验报告.doc
- DAY3 scp,rsync,chmod,chown,setfacl
- echarts formatter_Angular 集成 Typescript 版本 Echarts (附代码)
- 何为监督学习、无监督学习、强化学习、弱监督学习、半监督学习、多示例学习?
- php中拼音转汉字,php 汉字拼音如何转换
- Java进阶(七)Java加密技术之非对称加密算法RSA
- 稳压集成7805的作用
- paypal html5 支付,uniapp 对接 paypal支付 (h5,app端)
- 用1:3电流镜恒定GM的输入输出轨到轨运放设计(自用一)
- Python 随机生成双色球
- hive | 解决character '​' not supported here
- Linux之NTFS、FAT32、exFAT各种格式硬盘挂载整理
- UPGRADE CATALOG
- kettle java脚本_kettle 调优