MySQL删除数据1093错误

 更新时间:2024年02月04日 11:32:52   作者:早起的年轻人  
在进行更新和删除操作的时候,条件语句里面有子查询语句,此时会报1093错误,本文就来介绍一下1093错误的解决,感兴趣的可以了解一下

现象:在进行更新和删除操作的时候,条件语句里面有子查询语句,此时会报1093错误!
错误日志:1093 - You can’t specify target table ‘t_suer_study_video’ for update in FROM clause

首先根据条件来查询

SELECT * FROM t_suer_study_video WHERE video_course_id =207;

如下图所求,其中有一个用户有两条数据,train_id 为 null 的那一条数据为重复数据,我需要删除的。

在这里插入图片描述

线上环境中,像上页面这样的数据,不小心产生了几千条,是写的程序的一个bug导致的问题,所以我需要批量删除,先按用户ID分组查询一下:

SELECT user_id, COUNT(*) FROM t_suer_study_video WHERE video_course_id =207 GROUP BY user_id;  

如下图,数量为2的用户的数据就是需要处理的

在这里插入图片描述

然后筛选分组的用户数据

SELECT
	user_id,
	COUNT(*) 
FROM
	t_suer_study_video 
WHERE
	video_course_id = 207 
GROUP BY
	user_id 
HAVING
	COUNT(*) > 1;

我这测试数据,只有一个用户的是重复的,实际中是有多个用户的

在这里插入图片描述

然后删除重复的,就是将上述分组查询出来的重复用户的ID作为条件来删除

DELETE 
FROM
	t_suer_study_video 
WHERE
	video_course_id = 207 
	AND train_id IS NULL 
	AND user_id IN (
					SELECT
						user_id 
					FROM
						t_suer_study_video 
					WHERE
						video_course_id = 207 
					GROUP BY
						user_id 
					HAVING
					COUNT(*) > 1 
	);

出现错误 1093 - You can’t specify target table ‘t_suer_study_video’ for update in FROM clause

在这里插入图片描述

原因:在进行更新和删除操作的时候,条件语句里面有子查询语句,此时会报1093错误!,MySQL在进行读取数据的时候 会加读锁(共享锁),其他请求可以再次加上读锁,但是不能加写锁,(如果在读的过程中,又有其他线程进行了更新操作,就会导致当前线程读取到的数据不是最新的数据,这就是不可重复读现象)。因此不支持对数据更新的同时进行查询操作,加了读锁 就不允许加写锁。

解决办法:外面多嵌套一层查询,原先的查询作为子查询。

DELETE 
FROM
	t_suer_study_video 
WHERE
	video_course_id = 207 
	AND train_id IS NULL 
	AND user_id IN (
				SELECT
					a.user_id 
				FROM
					(
							SELECT
								user_id 
							FROM
								t_suer_study_video 
							WHERE
								video_course_id = 207 
							GROUP BY
								user_id 
							HAVING
								COUNT(*) > 1 
					) a 
	);

删除成功

在这里插入图片描述

 到此这篇关于MySQL删除数据1093错误的文章就介绍到这了,更多相关MySQL 1093错误内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用SQL查询所有数据库名和表名问题

    使用SQL查询所有数据库名和表名问题

    这篇文章主要介绍了使用SQL查询所有数据库名和表名问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • 深入解析MySQL的窗口函数

    深入解析MySQL的窗口函数

    这篇文章主要介绍了深入解析MySQL的窗口函数,窗口可以理解为记录集合,窗口函数就是在满足某种条件的记录集合上执行的特殊函数,即:应用在窗口内的函数,需要的朋友可以参考下
    2023-07-07
  • mysql 读写分离(实战篇)

    mysql 读写分离(实战篇)

    MySQL Proxy最强大的一项功能是实现“读写分离(Read/Write Splitting)”。
    2009-04-04
  • mysql 中如何取得汉字字段的各汉字首字母

    mysql 中如何取得汉字字段的各汉字首字母

    这篇文章主要介绍了mysql中如何取得汉字字段的各汉字首字母,需要的朋友可以参考下
    2014-08-08
  • MySQL使用Xtrabackup备份流程详解

    MySQL使用Xtrabackup备份流程详解

    这篇文章主要介绍了MySQL使用Xtrabackup备份流程详解,帮助大家更好的理解和学习使用MySQL,感兴趣的朋友可以了解下
    2021-03-03
  • 关于MySQL索引的深入解析

    关于MySQL索引的深入解析

    这篇文章主要给大家介绍了关于MySQL索引的深入解析,文中通过示例代码介绍的非常详细,对大家学习或者使用MySQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-11-11
  • 关于MySql数据库Update批量更新不同值的实现方法

    关于MySql数据库Update批量更新不同值的实现方法

    这篇文章主要介绍了关于MySql数据库Update批量更新不同值的实现方法,数据库管理系统可以通过SQL管理数据库,定义和操作数据,维护数据的完整性和安全性,需要的朋友可以参考下
    2023-05-05
  • SQL中如何将行转成列详解

    SQL中如何将行转成列详解

    行列转换在做报表分析时还是经常会遇到的,今天就说一下如何实现行列转换吧,下面这篇文章主要给大家介绍了关于SQL中如何将行转成列的相关资料,需要的朋友可以参考下
    2022-11-11
  • MySQL数据库优化详解

    MySQL数据库优化详解

    这篇文章主要介绍了MySQL数据库优化的方方面面,各种小技巧,需要的朋友可以参考下
    2014-08-08
  • MySQL函数之字符串函数解读

    MySQL函数之字符串函数解读

    MySQL提供了多种字符串函数,如CONCAT、CONCAT_WS、LENGTH、CHAR_LENGTH、LEFT、RIGHT、REPLACE、SUBSTRING、TRIM、FIND_IN_SET和FORMAT,用于处理数据库中的字符串数据
    2024-12-12

最新评论