gpt4 book ai didi

java - 如何在主键违规导致的 BatchUpdateException 后继续插入行?

转载 作者:太空宇宙 更新时间:2023-11-04 11:26:50 24 4
gpt4 key购买 nike

这个问题可能很愚蠢,但我面临着这种情况:

我有一个每次用户发送请求时都会填充的表,我在插入的最后一行中的一个字段(日期)上使用日期。问题是,我插入的最后一行总是会尝试插入自身,因为它在我正在考虑的范围内。我知道解决方案可能只是在最后一行添加一两分钟,但我的问题由此而来。我如何在java中使用PreparedStatement和批处理插入多行,跳过那些向我发送 PRIMARY_KEY_VIOLATION 异常的行,并继续插入正常的行?我的意思是,例如,我的表中有一行“runner”,其值为 25,这是我的主键,然后我想插入这些行:(25,26,27)无法插入 25 个值,因此我想捕获异常并执行某些操作以继续插入 26 和 27 值。是否可以?

感谢您的帮助和评论。预先感谢您!

最佳答案

我并不完全清楚你想要实现什么目标。数据库模式、代码和示例可能会有所帮助。但据我了解,有以下提示:

  • 考虑一下您的主键

    • 技术 key 应该是唯一的无需任何编程(例如反复试验...)。时间戳通常不满足该标准。数据库的序列数据类型GUID是一个不错的选择,因为它们就是用于这种用途的。

    • 非技术键应代表整行并且特定行。日期/时间戳可能是代表日历应用程序中的一天或特定时间实例的可接受的键。时间戳通常并不代表“用户请求”。

  • 以事务的方式思考:数据库通常强调原子性、事务性操作。如果部分操作失败,您必须回滚整个事务。正如 AndrewS 指出的那样,在 BatchUpdateException 之后继续批处理可能是可能的(取决于驱动程序),但这绝对不是一个好的做法。这是一种代码味道,表明您一开始就做错了什么。

  • 避免异常:在控制流中使用异常也被认为是一种代码味道(例如,参见 Java: Exceptions as control flow? 引用 Joshua Bloch 的“Effective Java”中的第 57 条)。通常首选在尝试操作之前检查导致异常的条件。或者正如 APC 指出的那样:如果您知道代码返回插入的最后一行,为什么不将其从插入语句中删除呢?

关于java - 如何在主键违规导致的 BatchUpdateException 后继续插入行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44266717/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com