在查询

时间:2017-01-23 12:11:26

标签: java sql

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

         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 befor start of process中删除数据,所以它总是添加一个空表。

建议我哪里出错了。

2 个答案:

答案 0 :(得分:1)

您似乎对distinct的工作方式有误解。在包含多个选定列的查询中,它将搜索不同的值元组,而不是仅针对不同的Csn列。

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

一般想法之一:仅为Csn列选择不同的单个值,然后遍历此列表并选择具有此Csn值的第一个值元组(我不知道它是否适用于你选择第一个元组是不是。)

答案 1 :(得分:0)

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

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