插件窝 干货文章 MySQL删除数据1093错误

MySQL删除数据1093错误

video 数据 class 删除 691    来源:    2024-10-16

现象:在进行更新和删除操作的时候,条件语句里面有子查询语句,此时会报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错误内容请搜索插件窝以前的文章或继续浏览下面的相关文章希望大家以后多多支持插件窝!