You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:50:37