有个表里有3个字段,其中1个字段是时间"2013-2"。把这个字段设为主键,目的是每次插值的时候,如果插入的值和时间字段相同就不插入。当我用java往这个表里插值的时候,虽然相同的时间不会往表里插值,但是java报错了java.sql.SQLException: ORA-00001: unique constraint (ULTRANMS.PK_TIMEMARKSRANK) violated.虽然不管它也行,但是总是不舒服。
有什么办法往表里插值时,判断一下,如果插入值和字符型时间字段相同就不插入?不想用程序写判断,就想在oracle里设置一下(这样简单点),可以吗?

解决方案 »

  1.   

    当使用insert into select 批量加载数据的时候,可能会碰到因为某些数据不符合加载条件,而导致整个insert 语句无法执行,全部rollback。这时可以使用DML 错误日志的特性,解决这个问题。 只需要创建一个日志表,并且在使用dml语句的时候添加dml error logging 语句,即可将错误的rows记录到日志表中,而且不会影响已经加载到表中的数据。最后修正这些无法加载的数据。dml error logging除了INSERT, 还支持UPDATE, MERGE,DELETE语句--例子create table t (name varchar2(10) not null);begin
      dbms_errlog.create_error_log(dml_table_name     => 't',
                                   err_log_table_name => 't_err');
    end;
    insert into t
      select name
        from (select 'a1' name
                from dual
              union all
              select 'a2'
                from dual
              union all
              select null from dual) log errors
        into t_err('test') REJECT LIMIT UNLIMITED;
    --UNLIMITED也可以写成其他数字,比如10,代表如果有超过10条的错误记录,则不能往t表中插入数据。不过即使超过了10条错误记录,t_err里总会插入错误的数据进去。
    commit;