我正在使用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删除数据,因此它总是添加到空表中。
建议我要去哪里错了。
最佳答案
您似乎对distinct
的工作方式有误解。在查询具有多个选定列的查询时,它将搜索不同的值元组,而不仅搜索不同的Csn
列。
有多种方法仅选择一列来选择不同的值。通常,这取决于您使用的特定DBMS和要应用于为相同Csn
列值找到的乘法元组的逻辑。例如考虑以下问题:DISTINCT for only one Column
总体思路之一:仅为Csn
列选择不同的单个值,然后遍历此列表并使用此Csn
值选择值的第一个元组(我不知道它是否适合选择第一个元组) 。