## MySQL多表同时删除方案
MySQL可以在一个SQL语句中删除多张表的记录,也可以通过多个表之间的关联关系删除某个表的数据,在MySQL4.0版本之后MySQL支持多表删除。
假定目前有两张表`goods`和`goods_price`表,前者是保存商品的具体信息,后者是保存商品的价格,具体的表结构如下:
```
create table goods (
`id` int unsigned primary key auto_increment,
`goods_name` varchar(30) not null default ''
)engine innodb charset utf8;
create table goods_price (
`goods_id` int unsigned not null,
`price` decimal(8,2) not null default '0.00'
)engine innodb charset utf8;
insert into goods values (1,'商品1'),(2,'商品2'),(3,'商品3'),(4,'商品4'),(5,'商品5');
insert into goods_price values (1,'5.44'),(2,'3.22'),(3,'5.55'),(4,'0.00'),(5,'4.54');
```
### 在delete时使用逗号分割删除
这里我们不适用join连接操作进行删除,具体SQL如下:
```
delete g.*,p.* from goods as g,goods_price as p where g.id = p.goods_id and g.id = 1;
```
### 使用连表查询
#### 使用inner join删除
使用`inner join`在连接时指定表与表之间的关联关系进行删除,具体SQL如下:
```
DELETE g.*,p.* FROM goods as g INNER JOIN goods_price as p ON g.id=p.goods_id WHERE g.id = 2;
```
> 使用连接删除的时候不必删除所有表数据,上面的SQL语句会同时删除`goods`和`goods_price`两张表中的数据,但是可以指定`DELETE g.*`从而只删除`goods`表中的记录,而不删除`goods_price`表中的记录[`DELETE g.* FROM goods as g INNER JOIN goods_price as p ON g.id=p.goods_id WHERE g.id = 3;`],但是在这里明显是不合适的,但是我们可以这样做。
### 使用left join删除
left join的使用方法如上,具体的SQL如下:
```
DELETE g.*,p.* FROM goods as g LEFT JOIN goods_price as p ON g.id=p.goods_id WHERE g.price = '0.00';
```
### 使用外键约束
给表新增约束外键并使用级联(cascade)方式对表与表之间关系进行约束。具体的SQL如下:
```
alter table goods_price
add constraint FK_goods_id foreign key(goods_id)
references goods(id) on delete cascade on update cascade;
```
修改完后我们后期删除主表数据,关联表数据也会被删除。
```
delete from goods where id=5;
```
相关推荐:[MySQL中InnoDB表引擎外键约束 ](http://blog.webfsd.com/post_mysql-zhonginnodb-biao-yin-qing-wai-jian-yue-shu.html)
- 写在前面
- MySQL的使用
- MySQL多表同时删除方案
- MySQL跨表、多表更新SQL语句总结
- MySQL存储引擎
- 安装
- 常规方式编译安装MySQL
- 采用cmake方式编译安装MySQL
- 使用rpm包安装MySQL
- 使用yum方式安装MySQL
- 采用二进制方式免编译安装MySQL
- 多实例的安装
- 什么是多实例
- 多实例的作用、问题以及应用场景
- 多实例安装01【推荐】
- 多实例官方安装方案02
- 启动、用户和权限管理
- 单实例MySQL的启动和关闭的方法
- 设置及修改MySQL root用户密码
- 找回丢失的MySQL root用户密码
- 创建MySQL用户及用户权限管理
- 基础命令的操作
- MySQL库和表相关操作
- MySQL中的索引操作
- MySQL常用命令
- MySQL的错误代码
- MySQL复习秘籍
- 备份与恢复
- 备份
- 恢复
- mysqlbinlog命令
- 服务日志
- 主从复制
- 主从复制部署配置问题汇总
- 主从复制读写分离
- 灾难恢复
- 配置phpmyadmin连接多实例MySQL
- 其他相关
- Sphinx实验
- 中文分词技术
- MySQL语句大全
- 用户创建、权限、删除
- 数据库与表显示、创建、删除
- 表复制及备份还原
- 数据库表中数据操作
- 修改表的列与表名
- 修改表中的数据
- 查询表
- 日志
- 批量修改Mysql表引擎为InnoDB的方法
- 数据库抽象层 PDO
- PDO对象常用方法
- PDO 事务处理
- PDO 与 MySQLi 二者效率简单比较
- 大小写敏感性 lower_case_table_names
- CentOS7安装MySQL5.7密码查看与修改