日期:2014-05-17  浏览次数:21133 次

问个用java往Oracle数据库插值时,字段唯一性的问题
有个表里有3个字段,其中1个字段是时间"2013-2"。把这个字段设为主键,目的是每次插值的时候,如果插入的值和时间字段相同就不插入。

当我用java往这个表里插值的时候,虽然相同的时间不会往表里插值,但是java报错了java.sql.SQLException: ORA-00001: unique constraint (ULTRANMS.PK_TIMEMARKSRANK) violated.虽然不管它也行,但是总是不舒服。


有什么办法往表里插值时,判断一下,如果插入值和字符型时间字段相同就不插入?不想用程序写判断,就想在oracle里设置一下(这样简单点),可以吗?

------解决方案--------------------
可以写个函数判断一下这个值在表中是否存在,然后在程序里面取得函数返回值,根据返回值判断是否需要插入。
------解决方案--------------------
当使用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;