63人参与 • 2025-04-14 • Mysql
在数据库操作中,处理重复数据插入是一个常见的需求。特别是在批量插入数据时,可能会遇到主键冲突或唯一键冲突(duplicate entry)的情况。如何优雅地捕获这类异常并执行相应的业务逻辑,是提高代码健壮性的关键。
本文将以一个实际的python mysql数据库操作为例,分析如何优化异常处理逻辑,使得当出现duplicate entry错误时,能够执行特定的业务方法(如更新记录状态)。同时,我们也会对比java中的类似处理方式,帮助读者更好地理解不同语言下的异常处理机制。
原始代码的功能是批量插入手机号数据到mysql数据库,其核心逻辑如下:
def insert_into_mysql(phone_numbers, prefix, province, city): try: connection = get_db_connection() cursor = connection.cursor() data_to_insert = [] for phone_number in phone_numbers: if len(phone_number) == 11: suffix = phone_number[-4:] data_to_insert.append((prefix, suffix, phone_number, province, city)) cursor.executemany(insert_query, data_to_insert) connection.commit() return true except exception as e: print(f"插入数据失败: {e}") if connection: connection.rollback() return false finally: if cursor: cursor.close() if connection: connection.close()
duplicate entry
)进行特殊处理。duplicate entry
时,执行额外逻辑(如调用update_is_deal
方法)。def insert_into_mysql(phone_numbers, prefix, province, city, url=none): connection = none cursor = none try: connection = get_db_connection() if not connection: print("数据库连接失败") return false cursor = connection.cursor() data_to_insert = [] for phone_number in phone_numbers: if len(phone_number) == 11: suffix = phone_number[-4:] data_to_insert.append((prefix, suffix, phone_number, province, city)) if not data_to_insert: print("警告: 没有有效的手机号可插入") return false cursor.executemany(insert_query, data_to_insert) connection.commit() print(f"成功插入 {len(data_to_insert)} 条数据") return true except exception as e: print(f"插入数据失败: {e}") if connection: connection.rollback() # 检查是否是唯一键冲突 if "duplicate entry" in str(e): if url: # 确保url有效 update_is_deal(url, province, city) # 执行额外逻辑 return false finally: if cursor: cursor.close() if connection: connection.close()
"duplicate entry"
,判断是否为唯一键冲突。url
参数,确保update_is_deal
方法可以正确执行。在java中,mysql的duplicate entry
错误通常对应sqlintegrityconstraintviolationexception
,我们可以采用类似的优化策略。
import java.sql.*; import java.util.list; public class phonenumberdao { private static final string insert_query = "insert into phone_numbers (prefix, suffix, phone_number, province, city) " + "values (?, ?, ?, ?, ?)"; public boolean insertintomysql(list<string> phonenumbers, string prefix, string province, string city, string url) { connection connection = null; preparedstatement statement = null; try { connection = databaseutil.getconnection(); // 获取数据库连接 connection.setautocommit(false); // 开启事务 statement = connection.preparestatement(insert_query); for (string phonenumber : phonenumbers) { if (phonenumber.length() == 11) { string suffix = phonenumber.substring(7); // 后4位 statement.setstring(1, prefix); statement.setstring(2, suffix); statement.setstring(3, phonenumber); statement.setstring(4, province); statement.setstring(5, city); statement.addbatch(); // 加入批处理 } } statement.executebatch(); // 执行批处理 connection.commit(); // 提交事务 return true; } catch (sqlintegrityconstraintviolationexception e) { // 捕获唯一键冲突异常 system.err.println("插入数据失败(唯一键冲突): " + e.getmessage()); if (connection != null) { try { connection.rollback(); // 回滚事务 } catch (sqlexception ex) { ex.printstacktrace(); } } if (url != null) { updateisdeal(url, province, city); // 执行额外逻辑 } return false; } catch (sqlexception e) { system.err.println("插入数据失败: " + e.getmessage()); if (connection != null) { try { connection.rollback(); } catch (sqlexception ex) { ex.printstacktrace(); } } return false; } finally { // 关闭资源 try { if (statement != null) statement.close(); if (connection != null) connection.close(); } catch (sqlexception e) { e.printstacktrace(); } } } private void updateisdeal(string url, string province, string city) { // 实现更新逻辑 system.out.println("检测到重复数据,更新状态: " + url); } }
sqlintegrityconstraintviolationexception
,而不是笼统的sqlexception
。addbatch()
和executebatch()
提高插入效率。commit()
和rollback()
,确保数据一致性。优化点 | python 实现 | java 实现 |
---|---|---|
异常捕获 | 检查str(e) 是否包含"duplicate entry" | 捕获sqlintegrityconstraintviolationexception |
事务管理 | connection.rollback() | connection.rollback() |
资源释放 | finally 块关闭连接 | finally 块关闭资源 |
批处理优化 | cursor.executemany() | addbatch() + executebatch() |
exception
,而应根据业务需求区分不同错误类型。try-finally
或try-with-resources
(java)确保数据库连接关闭。duplicate entry
更高效。update_is_deal
逻辑?insert ignore
或on duplicate key update
?通过本文的优化案例,我们学习了如何在python和java中精细化处理mysql的duplicate entry
错误,并执行额外的业务逻辑。关键在于:
到此这篇关于mysql处理重复数据插入的处理方案的文章就介绍到这了,更多相关mysql重复数据插入处理内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论