插入时删除重复值

时间:2012-02-15 04:28:01

标签: java sql

您好我正在尝试将excel表中的值插入到java中的SQL数据库中。 SQL数据库已经通过其他一些技术插入了一些行。现在我需要从excel表中插入新行,并且应该消除数据库和excel表中存在的重复值。为此,我写了这样的查询。

首先,我使用插入查询

将excelsheet中的记录插入到SQL数据库中
    Statement.executeUpdate(("INSERT INTO dbo.Company(CName,DateTimeCreated) values 
   ('"+Cname”' ,'"+ts+"');

后来我使用删除查询删除了重复的值。

      String comprows="delete from dbo.Company  where Id not in"
                + "(select min(Id) from dbo.Company "
                + "group by CName having count(*)>=1)";
          statement3.executeUpdate(comprows);

其中Id是自动增量整数。 但是插入然后删除是不好的。 我怎么知道这些值已经存在?如果它存在,我如何在插入过程中删除???

3 个答案:

答案 0 :(得分:2)

您可以先为SELECT点击CName。如果找到记录,则更新else插入新记录。 编辑添加代码段:

ResultSet rs = Statement.query("SELECT Id from dbo.Company where CNAME = '" +Cname + "'");

if(rs.next()) {
  // retrieve ID from rs
  // fire an update for this ID
} else {
   // insert a new record.
}

或者,如果您认为桌面上已经存在重复项,并且您想要删除它们..

ResultSet rs = Statement.query("SELECT Id from dbo.Company where CNAME = '"+Cname + "'");

List idList = new ArrayList();
while(rs.next()) {
  // collect IDs from rs in a collection say idList
}
if(!isList.isempty()) {
    //convert the list to a comma seperated string say idsStr
    Statement.executeUpdate("DELETE FROM dbo.Company where id in ("+ idsStr + ")");
}
// insert a new record.
Statement.executeUpdate(("INSERT INTO dbo.Company(CName,DateTimeCreated) values('"+Cname”' ,'"+ts+"');

当然,良好的做法是使用PreparedStatement,因为它会提高性能。 PS:对不起任何语法错误。

答案 1 :(得分:0)

一种选择是创建临时表并在那里转储Excel数据。然后,您可以编写一个插件,将临时表与dbo.Company表连接起来,并仅插入尚未存在的记录。

您可以对要插入的每个记录执行查找,但是如果您要处理的是大卷,这不是一种超级有效的方法,因为您必须为excel电子表格中的每条记录执行选择和插入操作。

合并语句在这些类型的情况下也非常有效。我不认为所有数据库都支持它们(我知道Oracle确实如此)。合并语句基本上是一个组合插入和更新,因此您可以查找最终表并插入(如果未找到)并更新(如果找到)。关于这一点的好处是你可以将所有这些作为一组而不是一次记录的效率。

答案 2 :(得分:0)

如果您可以控制数据库架构,您可以考虑为任何列添加唯一的约束以避免重复。当你进行插入时,它会在尝试添加dup数据时抛出。在它一直抛出你之前抓住它。

在数据库本身上强制执行这样的约束通常很好;这意味着没有人查询数据库必须担心无效重复。此外,乐观地首先尝试插入(没有先单独选择)可能会更快。