2017-01-23 102 views
1

我正在使用java来执行一些SQL查询。其中一些是从一个数据库(A)获取数据并将数据存储在另一个数据库(B)的表中。完成过程后,我从数据库(B)的表中删除所有数据。我每5分钟重复一次这个过程。 代码:在查询中使用不同关键字的重复条目whi

  String sql = "delete from newtable"; 
     stmt5 = conn.prepareStatement(sql); 
     stmt5.executeUpdate(sql); 
     String sql_1 = "select distinct tbl_alm_log_2000000000.Csn, tbl_alm_log_2000000000.IsCleared, tbl_alm_log_2000000000.Id,tbl_alm_log_2000000000.NEType, tbl_alm_log_2000000000.OccurTime, tbl_alm_log_2000000000.hostIP, tbl_alm_log_2000000000.ExtendInfo From fmdb.dbo.tbl_alm_log_2000000000 Where IsCleared = 0"; 

     ResultSet rs = stmt_1.executeQuery(sql_1); 



     String sql_2 = "insert into newtable (CSN, IsCleared, Id, NEType, OccurTime, hostIP) values(?,?,?,?,?,?)"; 


     conn.setAutoCommit(false); 
     PreparedStatement ps = conn.prepareStatement(sql_2); 

     final int batchSize = 1000; 
     int count = 0; 

     while (rs.next()){     
       ps.setString(1, rs.getString(1)); //csn 
       ps.setString(2, rs.getString(2)); //iscleared 
       ps.setString(3, rs.getString(3));//id 
       ps.setString(4, rs.getString(4));//netype 
       ps.setString(5, rs.getString(5));//occurtime 
       ps.setString(6, rs.getString(6));//hostip 


      ps.addBatch(); 

      if(++count % batchSize == 0) { 
       ps.executeBatch(); 
      } 
     } 
     ps.executeBatch(); // insert remaining records 
     conn.commit(); 
     ps.close(); 

它运行完美10点-20运行,然后给出了“重复输入错误的‘价值’,在CSN,因为它是主键”。 我在查询中添加了Distinct关键字,它在10-20次运行后仍然出现此错误。

注意:我从newtable中删除数据,因为它始终在一个空表中添加。

建议我去错了。

+0

检查是否有场'ExtendInfo'不同的值。 'insert'中没有使用这个字段。如果你不需要它。从'select'中删除该字段。 – Viki888

+0

我删除了不兼容的数据库标签。请标记您真正使用的数据库。 –

+0

@ viki888它正在使用,但我删除了那部分,因为我认为它不涉及这个问题。我应该把它放回去吗? –

回答

1

看起来你对distinct的工作方式有误解。在查询多个选定的列时,它将搜索不同的值元组,而不是仅针对不同的Csn列。

如何仅按一列选择不同的值有不同的方法。它通常取决于您使用的特定DBMS以及要应用于相同Csn列值的多个元组的逻辑。例如考虑这样一个问题:DISTINCT for only one Column

一个总体思路:选择不同的单值Csn列只,然后通过此列表迭代,并选择与此Csn值值的第一个元组(我不知道是不是适合你选择第一个元组或不)。

0

当您插入数据时,您可以添加if not exists不能确保您的数据是唯一的(我认为CSN只有在PK列)

if not exists(select 1 from tbl_alm_log_2000000000 where CSN=?) 
    insert into newtable (CSN, IsCleared, Id, NEType, OccurTime, hostIP) values(?,?,?,?,?,?)