【问题标题】:Oracle JDBC: How to know which row throws unique key constraint?Oracle JDBC:如何知道哪一行引发了唯一键约束?
【发布时间】:2013-08-29 18:17:49
【问题描述】:

我有一个我正在尝试使用 jdbc 执行的 oracle 查询。以下是查询。

insert into bd_vehicles_temp select * from bd_vehicles_temp_1

表 bd_vehicles_temp_1 包含大约 7000-10000 行。如果 bd_vehicles_temp_1 中的主键已经存在于 bd_vehicles_temp 中,我会收到 SQLException : Unique key constraint。

我的代码中的异常行是pstmt.executeUpdate()。有没有办法查明 bd_vehicles_temp_1 中导致异常的行。

或者我是否必须遍历 bd_vehicles_temp_1 中的行并一一插入每一行?

提前致谢!

【问题讨论】:

    标签: java sql oracle jdbc


    【解决方案1】:

    如果您知道可能导致异常的列,您可以使用(Oracle 特定)

    SELECT col FROM bd_vehicles_temp
    INTERSECT
    SELECT col FROM bd_vehicles_temp_1;
    

    识别两个表中的所有行。

    【讨论】:

    • 这与列无关。我更关心是哪一行导致了错误。
    • 我如何做相交?我对数据库查询的了解较少。我是前端开发人员
    • 我想使用代码来实现这一点。不涉及手动直觉!
    • 我已经知道会导致这种情况的列。只有一个这样的列。
    • 重写答案以反映 cmets 并删除 cmets。
    【解决方案2】:

    您正在尝试插入表格,对吗?您应该使用pstmt.executeUpdate() 而不是pstmt.execute()。如果您的表中已经存在记录,则最好删除所有行并在此语句执行多次时重新添加。

    【讨论】:

    【解决方案3】:

    找出导致问题的行的唯一方法(我知道)是使用 Oracle 的“将错误记录到”功能。这样insert 就不会抛出异常,并且任何违反任何约束的行都将被写入指定的错误表中。

    为此,您首先需要创建一个包含被拒绝行的日志表:

    EXECUTE DBMS_ERRLOG.CREATE_ERROR_LOG('BD_VEHICLES_TEMP');
    

    这将创建一个名为ERR$_BD_VEHICLES_TEMP的表

    然后运行将您的语句更改为:

    insert into bd_vehicles_temp 
    select * 
    from bd_vehicles_temp_1
    LOG ERRORS REJECT LIMIT UNLIMITED;
    

    即使一行未能验证约束,该语句仍将继续。语句完成后,您可以检查表 ERR$_BD_VEHICLES_TEMP 的内容是否有违反约束的行,包括错误消息和值。

    (编辑):如果您想在第一个错误处停止(并在日志表中查看),则省略REJECT LIMIT UNLIMITED 子句。

    更多细节在手册中:

    【讨论】:

    • 这些东西是oracle提供给我的。我如何使用 jdbc 来使用它。
    • 值得注意的是,REJECT LIMIT UNLIMITED 将导致部分插入。 @AbishekSingh:为避免这种情况,您可以简单地省略 REJECT LIMIT UNLIMITED 子句。
    • @AbhishekSingh:只需运行插入,如图所示通过 JDBC。错误表的创建可以使用 SQL*Plus 完成,因为只需要完成一次(当然您也可以通过 JDBC 调用该过程)。
    • @FrankSchmitt:也许我误解了什么,但这不是目标吗?将所有正确的行放入目标表中,而不插入错误的行? (感谢您纠正复制和粘贴错误)
    • 如果他们想知道是哪些行导致了失败,但希望只有在所有行都成功时才成功,他们可以检查错误表,报告失败的行,然后回滚。
    猜你喜欢
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 2014-07-18
    • 1970-01-01
    • 1970-01-01
    • 2014-11-28
    • 2011-05-28
    • 1970-01-01
    相关资源
    最近更新 更多