插入时如何批量插入取决于准备批处理的数据

时间:2016-04-15 15:52:07

标签: java sql database architecture derby

我的Java应用程序从CSV文件中读取行并将它们放入数据库(Apache Derby)。我想实现批量插入,因为我插入了数千条记录,所以我希望提高性能。但是,如何插入数据取决于数据库中已有的数据,例如我想批量插入以下内容:

INSERT INTO user (name) VALUES (?);

但是,如果下面没有返回任何数据,我只执行上述操作:

SELECT * FROM user WHERE name='Tim';

如果我正在批处理插入,那么我的SELECT可能找不到最新的数据,因为它正在等待批处理。

任何人都可以找到解决方案吗?也许是缓存机制?

1 个答案:

答案 0 :(得分:1)

一个简单的选项是使批处理条目成为INSERT / SELECT语句,这样只有在满足查询条件时才会发生插入。

这将是:

Lists<String> usernames = new ArrayList<>();
//.... data in list assumed
for(String username: usernames) {
    statement.addBatch("INSERT INTO USER(NAME) SELECT '" + username+ "' FROM USER WHERE NOT EXISTS(SELECT 1 FROM USER WHERE NAME = '" + username + "')");
}

这将使数据库处理检查是否存在正在插入的记录。 对应数据已经存在于数据库中的每个语句都不会插入,并且它的返回计数将为0.但无论如何你都不会关心它。

我快速用Google搜索,发现Derby显然支持INSERT / SELECT功能。您可以在此处找到有关此语法的更多信息:https://db.apache.org/derby/docs/10.0/manuals/reference/sqlj40.html