PostgreSQL删除数据后无法插入同表问题求助
问题分析与解决方案
碰到这种删完数据就插不进去的情况,我之前也踩过类似的坑,结合你的代码来看,最可能的原因和解决方法如下:
1. 错误使用Query()执行无返回结果的DELETE语句
PostgreSQL的Go驱动中,Query()是为查询返回多行结果的场景设计的(比如SELECT)。当你用它执行DELETE这类不返回数据的语句时,驱动会创建一个空的结果集对象,如果你没有手动关闭这个结果集,当前数据库连接会一直处于"未完成"状态,事务无法正常推进,后续的插入操作会因为事务锁被持有或者状态异常而失败。
你的代码里刚好犯了这个错误:
// 错误用法:用Query执行DELETE,且未处理返回的Rows _, err = con.Query(` DELETE FROM loan_aims WHERE _loan = $1; `, input.ID)
修正方法
改用Exec()执行DELETE语句,它专门用于处理无返回结果的SQL操作,不会创建结果集,执行后直接释放相关资源:
_, err = con.Exec(`DELETE FROM loan_aims WHERE _loan = $1;`, input.ID) if err != nil { tx.Rollback() log.Println(err) return false, fmt.Errorf("can not delete additional data from loan_aims") }
2. 其他排查方向
如果换用Exec()后问题依然存在,可以检查这两个点:
- 事务提交/回滚逻辑:确保你的事务在所有操作完成后调用了
tx.Commit()(你的代码里没看到提交逻辑,这可能也是隐患!),如果只在错误时回滚,成功时不提交,数据不会写入,也可能导致后续操作异常。 - 数据库锁状态:可以在插入失败时,查询PostgreSQL的锁状态(比如用
SELECT * FROM pg_locks;),看是否有未释放的锁阻塞了插入操作。
总结
优先把DELETE操作从Query()换成Exec(),这是解决你当前问题最直接的方案。同时记得在所有操作成功后调用tx.Commit(),避免事务悬而未决。
内容的提问来源于stack exchange,提问作者Akezhan
相关产品推荐
相关产品推荐

