Python解決MySQL數(shù)據(jù)處理從SQL批量刪除報錯
一、背景
MySQL數(shù)據(jù)庫表中有一批重復的臟數(shù)據(jù),為不影響正常業(yè)務(wù),需要進行批量刪除。數(shù)據(jù)示例如下圖所示:

二、SQL批量刪除
首先想到的是編寫SQL語句來批量刪除:刪除身份證號為51****59且ID不為5的全部數(shù)據(jù)(保留ID為5的那一條數(shù)據(jù))
DELETE
FROM
test_table
WHERE
id IN ( SELECT id FROM test_table WHERE id_card_no = "51****59" AND id != 5 );
運行結(jié)果:

刪除失敗,SQL語句運行時報錯了
鑒于當時實際情況需要盡快刪除臟數(shù)據(jù),就沒有在此做過多的考究,原因和解決詳見第四小節(jié):SQL運行問題排查
三、Python批量刪除
數(shù)據(jù)準備
將SQL查詢到的所有需要刪除的數(shù)據(jù)ID保存到txt文件中
SELECT id FROM test_table WHERE id_card_no = "51****59" AND id != 5;

讀取數(shù)據(jù)ID
def del_from_mysql():
# 【讀取數(shù)據(jù)ID】
with open(file="新建文本文檔.txt", mode="r", encoding="utf-8") as f:
data = f.read()
f.close()
ids = data.split("\n")
print(ids)
if __name__ == "__main__":
del_from_mysql()運行結(jié)果:

連接數(shù)據(jù)庫執(zhí)行SQL
這里需要先安裝b并導入pymysql第三方庫
pip install pymysql
導入
import pymysql
def del_from_mysql(dbinfo):
# 【讀取數(shù)據(jù)ID】
with open(file="新建文本文檔.txt", mode="r", encoding="utf-8") as f:
data = f.read()
f.close()
ids = data.split("\n")
# 【連接數(shù)據(jù)庫執(zhí)行SQL】
conn = pymysql.connect(**dbinfo)
cursor = conn.cursor()
for i in ids:
sql = f"delete from test_table where id={i}"
cursor.execute(sql)
conn.commit()
conn.close()
if __name__ == "__main__":
# 數(shù)據(jù)庫信息
db_info = {
'host': "192.168.1.1",
'port': 3306,
'user': "test",
'passwd': "test",
'db': "test_",
'charset': "utf8"
}
del_from_mysql(db_info)運行結(jié)果:

可以看到這時已經(jīng)完成重復臟數(shù)據(jù)的刪除
四、SQL運行問題排查
前面使用SQL批量刪除時遇到了報錯:You can't specify target table 'test_table' for update in FROM clause
查閱資料后發(fā)現(xiàn):在Mysql中,delete或者update的where條件中不能包含同一張表的子查詢語句,而在where條件中再加一個中間表就能解決此問題

修改后的SQL語句如下:
DELETE
FROM
test_table
WHERE
id IN ( SELECT * FROM ( SELECT id FROM test_table WHERE id_card_no = "51****59" AND id != 5 ) t1 );
以上就是MySQL數(shù)據(jù)處理:從SQL批量刪除報錯到Python優(yōu)雅解決的詳細內(nèi)容,更多關(guān)于Python解決SQL批量刪除報錯的資料請關(guān)注腳本之家其它相關(guān)文章!
- Python在for循環(huán)里處理大數(shù)據(jù)的推薦方法實例
- Python?Pipeline處理數(shù)據(jù)工作原理探究
- 全面掌握Python?JSON庫函數(shù)與方法學會JSON數(shù)據(jù)處理
- 掌握python polars庫進行高效高速的數(shù)據(jù)處理。
- Python鏈式調(diào)用數(shù)據(jù)處理實際應用實例探究
- Python Dask庫處理大規(guī)模數(shù)據(jù)集的強大功能實戰(zhàn)
- Python?pydash庫處理大規(guī)模數(shù)據(jù)集執(zhí)行復雜操作
- python datatable庫大型數(shù)據(jù)集和多核數(shù)據(jù)處理使用探索
相關(guān)文章
Python 爬蟲之Beautiful Soup模塊使用指南
這篇文章主要介紹了Python 爬蟲之Beautiful Soup模塊使用指南,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-07-07
Python接入MySQL實現(xiàn)增刪改查的實戰(zhàn)記錄
這篇文章主要給大家介紹了關(guān)于Python接入MySQL實現(xiàn)增刪改查的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-03-03
Pandas實現(xiàn)(pivot_table函數(shù))數(shù)據(jù)透視表方式
pandas的pivot_table()函數(shù)非常強大,主要用于創(chuàng)建數(shù)據(jù)透視表,重要參數(shù)包括index、values、columns和aggfunc,index用于設(shè)置行索引,類似于SQL中的group by,values用于進行聚合計算的數(shù)據(jù)選擇,columns參數(shù)可設(shè)置列層次,非必須2024-09-09
利用python中pymysql操作MySQL數(shù)據(jù)庫的新手指南
PyMySQL是在Python3.x版本中用于連接MySQL服務(wù)器的一個庫,Python2中是使用mysqldb,這篇文章主要給大家介紹了關(guān)于利用python中pymysql操作MySQL數(shù)據(jù)庫的相關(guān)資料,需要的朋友可以參考下2021-09-09

