MYSQL 不允许在子查询的同时删除原表数据的解决方法

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

对于这个错误信息:

ERROR 1093 (HY000): You can't specify target table 'clients' for update in FROM clause

或者:

ERROR 1093 (HY000): You can't specify target table 'clients' for delete in FROM clause



一直以来我以为只有一种办法。不过今天翻开以前的书,发现还有一个方法。

表结构和示例数据:

mysql> show create table branches\G

*************************** 1. row ***************************

       Table: branches

Create Table: CREATE TABLE `branches` (

  `bid` int(11) NOT NULL,

  `cid` int(11) NOT NULL,

  `bdesc` varchar(1000) NOT NULL,

  `bloc` char(2) NOT NULL,

  PRIMARY KEY (`bid`),

  KEY `cid` (`cid`),

  CONSTRAINT `branches_ibfk_1` FOREIGN KEY (`cid`) REFERENCES `clients` (`cid`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8

1 row in set (0.00 sec)


mysql> select * from branches;

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

| bid  | cid | bdesc                          | bloc |

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

| 1011 | 101 | Corporate HQ                   | CA   |

| 1012 | 101 | Accounting Department          | NY   |

| 1013 | 101 | Customer Grievances Department | KA   |

| 1031 | 103 | N Region HO                    | ME   |

| 1032 | 103 | NE Region HO                   | CT   |

| 1033 | 103 | NW Region HO                   | NY   |

| 1041 | 104 | Branch Office (East)           | MA   |

| 1042 | 104 | Branch Office (West)           | CA   |

| 1101 | 110 | Head Office                    | CA   |

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

9 rows in set (0.00 sec)

mysql> show create table clients\G

*************************** 1. row ***************************

       Table: clients

Create Table: CREATE TABLE `clients` (

  `cid` int(11) NOT NULL,

  `cname` varchar(64) NOT NULL,

  PRIMARY KEY (`cid`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8

1 row in set (0.00 sec)

mysql> select * from clients;

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

| cid | cname                       |

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

| 101 | JV Real Estate              |

| 102 | ABC Talent Agency           |

| 103 | DMW Trading                 |

| 104 | Rabbit Foods Inc            |

| 110 | Sharp Eyes Detective Agency |

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

5 rows in set (0.00 sec)


mysql> delete from clients where cid = (select clients.cid from clients left join branches using(cid) where bid is null);

ERROR 1093 (HY000): You can't specify target table 'clients' for update in FROM

clause


解决办法

1、利用变量赋值。

mysql> select @m_cid:=clients.cid from clients left join branches using(cid) where bid is null;

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

| @m_cid:=clients.cid |

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

|                 102 |

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

1 row in set (0.00 sec)

mysql> delete from clients where cid = 102;

Query OK, 1 row affected (0.05 sec)


mysql> select * from clients;

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

| cid | cname                       |

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

| 101 | JV Real Estate              |

| 103 | DMW Trading                 |

| 104 | Rabbit Foods Inc            |

| 110 | Sharp Eyes Detective Agency |

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

4 rows in set (0.00 sec)


2、用EXISTS关键字和相关子查询:(不过这个没有之前的效率高)

mysql> insert into clients values(102,'ABC Talent Agency');

Query OK, 1 row affected (0.05 sec)


mysql> delete from clients where not exists

    -> (

    -> select * from branches where branches.cid = clients.cid

    -> );

Query OK, 1 row affected (0.06 sec)


mysql> select * from clients;

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

| cid | cname                       |

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

| 101 | JV Real Estate              |

| 103 | DMW Trading                 |

| 104 | Rabbit Foods Inc            |

| 110 | Sharp Eyes Detective Agency |

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

4 rows in set (0.00 sec)








本文转自 david_yeung 51CTO博客,原文链接:http://blog.51cto.com/yueliangdao0608/81390,如需转载请自行联系原作者
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4天前
|
关系型数据库 MySQL 数据库
docker MySQL删除数据库时的错误(errno: 39)
docker MySQL删除数据库时的错误(errno: 39)
13 0
|
1天前
|
关系型数据库 MySQL 分布式数据库
如何将数据从MySQL迁移到PolarDB?
【5月更文挑战第13天】如何将数据从MySQL迁移到PolarDB?
10 0
|
5天前
|
存储 关系型数据库 MySQL
MySQL是怎样存储数据的?
MySQL是怎样存储数据的?
|
6天前
|
SQL 关系型数据库 MySQL
这篇文章带你了解:如何一次性将Centos中Mysql的数据快速导出!!!
这篇文章带你了解:如何一次性将Centos中Mysql的数据快速导出!!!
|
6天前
|
存储 SQL 关系型数据库
MySQL的优化利器⭐️索引条件下推,千万数据下性能提升273%🚀
以小白的视角探究MySQL索引条件下推ICP的优化,其中包括server层与存储引擎层如何交互、索引、回表、ICP等内容
MySQL的优化利器⭐️索引条件下推,千万数据下性能提升273%🚀
|
7天前
|
SQL 数据库
mysql-相关子查询
该任务是找出未选修任何课程的学生学号和姓名。通过在教学数据库中使用SQL子查询,先获取选修了课程的学生学号集合,然后在外层查询中找出不在这个集合中的学生信息。代码实现为:`select sno, sname from student where sno not in (select distinct sno from score);`
18 0
|
7天前
|
数据库
mysql-相关子查询
任务是找出选修了课程004的学生姓名和所在系。在teachingdb数据库中,使用子查询和EXISTS关键字来实现。代码示例:`select sname, sdept from student a where exists (select * from score b where a.sno=b.sno and b.cno=004);`
11 0
|
7天前
|
关系型数据库 MySQL 数据库
MySQL -相关子查询
该任务是数据库查询,目标是找出所有选修了"刘东明"所选全部课程的学生学号。需运用子查询和NOT EXISTS运算符。代码首先选择学生表中名字不是'刘东明'的学生,然后检查他们是否存在与'刘东明'相同的所有课程记录。
14 0
|
7天前
|
SQL 数据库
mysql-相关子查询
在教学数据库teachingdb中,使用子查询和NOT EXISTS运算符找出选修了所有课程的学生学号。代码如下: ```sql SELECT sno FROM student a WHERE NOT EXISTS (SELECT cno FROM course b WHERE NOT EXISTS (SELECT * FROM score WHERE sno=a.sno AND cno=b.cno)); ``` 这段SQL语句查找的是没有匹配未选修课程记录的学生学号,即这些学生选修了所有课程。
|
7天前
|
存储 关系型数据库 MySQL
MySQL字段的字符类型该如何选择?千万数据下varchar和char性能竟然相差30%🚀
本篇文章来讨论MySQL字段的字符类型选择并深入实践char与varchar类型的区别以及在千万数据下的性能测试
MySQL字段的字符类型该如何选择?千万数据下varchar和char性能竟然相差30%🚀