Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 主键冲突导致BatchUpdateException后如何继续插入行?_Java_Oracle_Jdbc_Primary Key - Fatal编程技术网

Java 主键冲突导致BatchUpdateException后如何继续插入行?

Java 主键冲突导致BatchUpdateException后如何继续插入行?,java,oracle,jdbc,primary-key,Java,Oracle,Jdbc,Primary Key,这样问可能很愚蠢,但我面临这样的情况: 我有一个表,每次用户发送请求时,我都会填充该表,我使用的是我插入的最后一行中的一个字段(日期)上的日期。问题是,我插入的最后一行总是尝试插入自己,因为它在我考虑的范围内。我知道解决方案可能只是在最后一行加上一两分钟,但我的问题由此而来。 在java中,如何使用PreparedStatement和batch插入多行,跳过向我发送PRIMARY_KEY_违例异常的行,并继续插入ok的行? 例如,我的表中有一行“runner”,值为25,这是我的主键,然后我想插

这样问可能很愚蠢,但我面临这样的情况:

我有一个表,每次用户发送请求时,我都会填充该表,我使用的是我插入的最后一行中的一个字段(日期)上的日期。问题是,我插入的最后一行总是尝试插入自己,因为它在我考虑的范围内。我知道解决方案可能只是在最后一行加上一两分钟,但我的问题由此而来。 在java中,如何使用PreparedStatement和batch插入多行,跳过向我发送PRIMARY_KEY_违例异常的行,并继续插入ok的行? 例如,我的表中有一行“runner”,值为25,这是我的主键,然后我想插入这些行: (25,26,27) 无法插入25个值,因此我希望捕获异常,并采取措施继续插入26和27个值。 可能吗


我感谢你的帮助和评论。提前谢谢你

我不太清楚你想达到什么目的。db模式、代码和示例可能会有所帮助。但据我所知,我有以下几点提示:

  • 想想你的主键

    • 技术密钥应是唯一的,无需任何编程(如尝试和错误…)。时间戳通常不满足该条件。数据库的序列数据类型或GUID是一个很好的选择,因为它们是用于此用途的

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

  • 在事务中思考:数据库通常强调原子的、事务性的操作。如果操作的一部分失败,则必须回滚整个事务。 正如AndrewS指出的,在
    BatchUpdateException
    之后继续批处理可能是可能的(取决于驱动程序),但这肯定不是一个好的做法。这是一种代码气味,表明你首先做错了什么

  • 避免异常:将异常用于控制流也被认为是一种代码味道(例如,参见Joshua Bloch的“有效Java”中的第57项)。在尝试操作之前检查导致异常的条件通常是首选的。或者正如APC指出的那样:如果您知道代码返回插入的最后一行,为什么不在insert语句中保留这一行呢


    • 我还不完全清楚你想要实现什么。db模式、代码和示例可能会有所帮助。但据我所知,我有以下几点提示:

      • 想想你的主键

        • 技术密钥应是唯一的,无需任何编程(如尝试和错误…)。时间戳通常不满足该条件。数据库的序列数据类型或GUID是一个很好的选择,因为它们是用于此用途的

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

      • 在事务中思考:数据库通常强调原子的、事务性的操作。如果操作的一部分失败,则必须回滚整个事务。 正如AndrewS指出的,在
        BatchUpdateException
        之后继续批处理可能是可能的(取决于驱动程序),但这肯定不是一个好的做法。这是一种代码气味,表明你首先做错了什么

      • 避免异常:将异常用于控制流也被认为是一种代码味道(例如,参见Joshua Bloch的“有效Java”中的第57项)。在尝试操作之前检查导致异常的条件通常是首选的。或者正如APC指出的那样:如果您知道代码返回插入的最后一行,为什么不在insert语句中保留这一行呢


      请参阅
      BatchUpdateException
      API。你的建议可能是可行的,但会非常丑陋。避免PK冲突。创建一个序列,以便“插入表T选择MYSEQUENCE.NEXTVAL、OTHER_FIELD1、OHTER_FIELD2,其中…@AndrewS-使用序列不能解决问题。当然,它会生成一个唯一的值,但您刚刚插入了一个重复的记录,其中包含一个无意义的技术键。问题是,为什么要选择一个已插入的行?当然,您需要解决的问题是获取有效的数据源,而不是处理数据目标中的异常。JDBC驱动程序实现可以选择在出错时停止或在出错时继续批处理,但驱动程序必须始终使用相同的处理。甲骨文选择对错误保释;无法更改此设置。请参阅
      BatchUpdateException
      API。你的建议可能是可行的,但会非常丑陋。避免PK冲突。创建一个序列,以便“插入表T选择MYSEQUENCE.NEXTVAL、OTHER_FIELD1、OHTER_FIELD2,其中…@AndrewS-使用序列不能解决问题。当然,它会生成一个唯一的值,但您刚刚插入了一个重复的记录,其中包含一个无意义的技术键。问题是,为什么要选择一个已插入的行?当然,您需要解决的问题是获取有效的数据源,而不是在data target.JD中处理异常