MySQL刪除數(shù)據(jù)1093錯誤
現(xiàn)象:在進行更新和刪除操作的時候,條件語句里面有子查詢語句,此時會報1093錯誤!
錯誤日志:1093 - You can’t specify target table ‘t_suer_study_video’ for update in FROM clause
首先根據(jù)條件來查詢
SELECT * FROM t_suer_study_video WHERE video_course_id =207;
如下圖所求,其中有一個用戶有兩條數(shù)據(jù),train_id 為 null 的那一條數(shù)據(jù)為重復(fù)數(shù)據(jù),我需要刪除的。

線上環(huán)境中,像上頁面這樣的數(shù)據(jù),不小心產(chǎn)生了幾千條,是寫的程序的一個bug導致的問題,所以我需要批量刪除,先按用戶ID分組查詢一下:
SELECT user_id, COUNT(*) FROM t_suer_study_video WHERE video_course_id =207 GROUP BY user_id;
如下圖,數(shù)量為2的用戶的數(shù)據(jù)就是需要處理的

然后篩選分組的用戶數(shù)據(jù)
SELECT user_id, COUNT(*) FROM t_suer_study_video WHERE video_course_id = 207 GROUP BY user_id HAVING COUNT(*) > 1;
我這測試數(shù)據(jù),只有一個用戶的是重復(fù)的,實際中是有多個用戶的

然后刪除重復(fù)的,就是將上述分組查詢出來的重復(fù)用戶的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 );
出現(xiàn)錯誤 1093 - You can’t specify target table ‘t_suer_study_video’ for update in FROM clause

原因:在進行更新和刪除操作的時候,條件語句里面有子查詢語句,此時會報1093錯誤!,MySQL在進行讀取數(shù)據(jù)的時候 會加讀鎖(共享鎖),其他請求可以再次加上讀鎖,但是不能加寫鎖,(如果在讀的過程中,又有其他線程進行了更新操作,就會導致當前線程讀取到的數(shù)據(jù)不是最新的數(shù)據(jù),這就是不可重復(fù)讀現(xiàn)象)。因此不支持對數(shù)據(jù)更新的同時進行查詢操作,加了讀鎖 就不允許加寫鎖。
解決辦法:外面多嵌套一層查詢,原先的查詢作為子查詢。
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 );
刪除成功

到此這篇關(guān)于MySQL刪除數(shù)據(jù)1093錯誤的文章就介紹到這了,更多相關(guān)MySQL 1093錯誤內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于MySql數(shù)據(jù)庫Update批量更新不同值的實現(xiàn)方法
這篇文章主要介紹了關(guān)于MySql數(shù)據(jù)庫Update批量更新不同值的實現(xiàn)方法,數(shù)據(jù)庫管理系統(tǒng)可以通過SQL管理數(shù)據(jù)庫,定義和操作數(shù)據(jù),維護數(shù)據(jù)的完整性和安全性,需要的朋友可以參考下2023-05-05

