mysql 的delete from 和update子查询限制

最经做项目时发现的问题,好像在update时也有。。。

网上查到的资料如下:

1.使用mysql进行delete from操作时,若子查询的 FROM 字句和更新/删除对象使用同一张表,会出现错误。

mysql> DELETE FROM tab1 WHERE col1 = ( SELECT MAX( col1 ) FROM tab1 ); 
ERROR 1093 (HY000): You can’t specify target table ‘tab1′ for update in FROM clause

针对“同一张表”这个限制,撇开效率不谈,多数情况下都可以通过多加一层select 别名表来变通解决,像这样

DELETE FROM tab1 
WHERE col1 = ( 
SELECT MAX( col1 ) 
FROM ( 
SELECT * FROM tab1 
) AS t 
); 
或这样

delete from theTable where id in
(
select id from
(
select min(id) id from theTable group by title HAVING count(*)>1
) ids
) ;

------------------------------------------------------------------------

2. mysql delete from where in 时后面 的查询语句里不能加where条件

Sql代码 
      delete from `t_goods` where fi_id in (select * from ( select fi_id from `t_goods` where fs_num is null and fs_name is null and fs_type is null and fs_using is null and fs_lifetime is null) b)

Sql代码 
      delete from `t_goods` where fi_id in (select fi_id from `t_goods` where fs_num is null and fs_name is null and fs_type is null and fs_using is null and fs_lifetime is null)

Sql代码 
      delete from `t_goods` where fi_id in ( select fi_id from `t_goods` )

上面三种情况,只有中间的不能执行。

综合起来就是mysql delete from where in 时后面 的查询语句里不能加where条件

---------------------------------------------------------------------------

3. delete from table... 这其中table不能使用别名

Sql代码

delete from student a where a.id in (1,2);(执行失败)

select a.* from student a where a.id in (1,2);(执行成功)

原文地址:https://www.cnblogs.com/chenjunsheng/p/9946585.html

时间: 2024-10-07 15:15:10

mysql 的delete from 和update子查询限制的相关文章

mysql:error 1093 update子查询

一. 需求 要将base_info.name以wl_开头的数据的status字段更新为2 二.执行 Update base_info Set a.status=2 Where (select id from base_info where name like '%xx%') 执行时,提示1093错误, ERROR 1093 (HY000): You can't specify target table 't' for update in FROM clause . mysql不支持修改一个表的时

MySQL(九)DQL之子查询

一.含义 嵌套在其他语句内部的select语句称为子查询或内查询,外面的语句可以是insert.update.delete.select等,一般select作为外面语句较多,外面如果为select语句,则此语句称为外查询或主查询. 二.分类 2.1.按出现位置 select后面:仅仅支持标量子查询 from后面: 表子查询 where或having后面: 标量子查询.列子查询.行子查询 exists后面:标量子查询.列子查询.行子查询.表子查询 2.2.按结果集的行列 标量子查询(单行子查询):

MySQL学习笔记(五)—— 子查询及联结

子查询: 子查询,即嵌套在其他查询中的查询.例如我们有这样几个表,顾客表,订单表,商品表,我们想知道有哪些客户买了商品A,那么我们就需要先查看哪些订单里包含了商品A,然后根据订单查出是哪些客户. mysql> select cust_id from orders where order_num in (select order_num from orderitems where prod_id = '1'); +---------+ | cust_id | +---------+ |    10

MySQL必知必会--使用子查询

子查询 版本要求 MySQL 4.1引入了对子查询的支持,所以要想使用 本章描述的SQL,必须使用MySQL 4.1或更高级的版本. SELECT语句 是SQL的查询.迄今为止我们所看到的所有 SELECT 语句 都是简单查询,即从单个数据库表中检索数据的单条语句. 查询(query) 任何SQL语句都是查询.但此术语一般指 SELECT 语句. SQL还允许创建子查询(subquery),即嵌套在其他查询中的查询. 为什么要这样做呢? 利用子查询进行过滤 本书所有章中使用的数据库表都是关系表.

MySQL—语法总结(2)子查询、连接、函数

比较运算符:=.>.<.>=.<=.<>.!=.<=> SELECT AVG(col_name) FROM tb_name; # 对指定字段使用聚合函数SELECT ROUND((AVG(col_name),2) FROM tb_name; # 对聚合函数结果保留两位小数SELECT col_name1,col_name2 FROM tb_name WHERE col_name1 >(SELECT ROUND((AVG(col_name),2) FRO

mysql的联合,连接,子查询

mysql update from 子查询

mssql 子查询更新 update log set uin= b.uinfrom log a,logs bwhere a.accountuin = b.accountuin mysql 不支持 update 子查询更新 找了半天资料 终于搞定了... update `log` a inner join `logs` b on a.`accountuin` = b.`accountuin`set a.`uin` = b.`uin` where a.`accountuin` = b.`accoun

MySQL子查询的优化

一.MySQL子查询的位置 当一个查询是另一个查询的子部分是,称之为子查询(查询语句中嵌套含有查询语句).子查询也是使用频率比较高的一种查询类型.因此,优化子查询,对于整个系统的性能也有直接的影响. 从查询出现在SQL语句的位置来看,它可以出现在目标列中,也可以出现在from子句中,还可以出现在JOIN/ON子句.GROUPBY子句.HAVING子句.ORDERBY子句等位置.下面依次来看这几种形式的子查询,以及对他们进行优化的一些想法. 1.子查询出现在目标列位置 当子查询出现在目标列位置的时

优化系列 | DELETE子查询改写优化

0.导读 有个采用子查询的DELETE执行得非常慢,改写成SELECT后执行却很快,最后把这个子查询DELETE改写成JOIN优化过程 1.问题描述 朋友遇到一个怪事,一个用子查询的DELETE,执行效率非常低.把DELETE改成SELECT后执行起来却很快,百思不得其解. 下面就是这个用了子查询的DELETE了: [[email protected]]mydb > EXPLAIN delete from trade_info where id in ( select id from ( sel