Java SQL-INSERT如果不存在,请检查是否相同或更新

Java SQL-INSERT如果不存在,请检查是否相同或更新,java,sql,sqlite,Java,Sql,Sqlite,我希望DBMS在执行大量插入时帮助我提高速度 今天,我用Java执行一个INSERT查询,如果数据已经在数据库中,则捕获异常。 我得到的例外是: SQLite Exception : [19] DB[1] exec() columns recorddate, recordtime are not unique. 如果出现异常,我将使用主键(recorddate,recordtime)执行选择查询,并将结果与我试图在Java中插入的数据进行比较。如果是相同的,我将继续下一次插入,否则我将评估数据

我希望DBMS在执行大量插入时帮助我提高速度

今天,我用Java执行一个INSERT查询,如果数据已经在数据库中,则捕获异常。 我得到的例外是:

SQLite Exception : [19] DB[1] exec() columns recorddate, recordtime are not unique.
如果出现异常,我将使用主键(
recorddate,recordtime
)执行
选择查询
,并将结果与我试图在Java中插入的数据进行比较。如果是相同的,我将继续下一次插入,否则我将评估数据并决定保存什么,并可能进行更新

这个过程需要时间,我想加快速度

我曾经考虑过如果不存在插入
INSERT
,但如果存在具有相同主键的数据,则忽略插入,对吗?在我忽略插入之前,我想确保它是完全相同的数据

如果您能给我一些建议,我将不胜感激


我正在使用Java处理大量数据,以插入SQLite数据库(SQLite v.3.7.10)。作为Java和SQLite之间的连接,我正在使用sqlite4java()

我不认为让dbms处理更多的逻辑会更快,至少在纯SQL中不会,因为我认为没有“创建或更新”

在处理大量条目时,延迟通常是一个重要问题,尤其是通过网络访问dbs时,所以至少在这种情况下,您希望尽可能使用大规模操作。即使提供了“创建或更新”而不是“选择并更新”或“插入”(如果是偶数)也只会减少一半的延迟

我意识到这不是你想要的,但我会尝试以不同的方式进行优化,处理数据块,将所有数据选择到地图中,然后将输入划分为创建、更新和忽略。这样,忽略几乎是免费的,进一步的查找保证在内存中完成。dbms不太可能明显更快

如果不确定这是否适合您,那么分析开销时间应该会有所帮助。

将所有插入和更新都打包到事务中。在SQL中,这将按如下方式编写

BEGIN;
INSERT OR REPLACE INTO Table(Col1,Col2) VALUES(Val1,Val2); 
COMMIT;
这里有两件事需要注意:在调用
COMMIT
之前,数据库分页和提交不会写入磁盘,从而大大加快了查询速度;第二件事是
INSERT或REPLACE
语法,它正好满足
UNIQUE
主键
字段的需要

大多数数据库包装器都有用于管理事务的特殊语法。您当然可以执行一个查询,
BEGIN
,然后执行插入和更新,最后执行
COMMIT
。阅读数据库包装器文档

你可以做的另一件事是切换到。在数据库上只运行一次以下命令

PRAGMA journal_mode = wal;

如果没有进一步的信息,我将:

BEGIN;
UPDATE table SET othervalues=... WHERE recorddate=... AND recordtime=...;
INSERT OR IGNORE INTO table(recorddate, recordtime, ...) VALUES(...);
COMMIT;
UPDATE
将更新所有现有行,忽略不存在的行,因为
WHERE
子句


INSERT
随后将添加新行,忽略现有行,因为
IGNORE

…请注意,您当前的数据库可能会遇到问题-并非所有时间在所有日期都有效;您应该存储单个时间戳,而不是单独的列。-1在单个语句上创建事务是毫无意义的@LS_dev,你是对的,这就是为什么我说“你所有的插入和更新”。我在您引用的代码片段中提供了一个示例。回想一下,这个问题是关于性能的,我的观点是应该在事务中执行数据库写入,这对于SQLite尤其如此。我已经在使用事务了,它帮助了很多,但仍然很慢。我会试试你的PRAGMA命令。但是您的SQL-QUERY并不能满足我的要求,它使用新值更新数据库,而不进行比较,我想知道它们是否相同,否则我必须进行比较。这不是我想要的工作。对于每个插入,您有两个查询,并且从不与数据库中存储的数据进行比较。对我来说,最终的查询将是一个INSERT查询,如果存在与INSERT主键相关的数据,它将返回数据。比较是什么意思?必须使用
CREATE TABLE。。。(…唯一的…)
。通过这种方式,“比较”是根据模式自动完成的。我的意思是,数据库表保存来自以前插入的数据,如果新插入的主键与已存储在表中的旧插入的主键相同,我希望比较新插入和旧插入(已存储在表中)数据来决定保留哪些数据。这样,您必须指定您的决策要求。如果不先进行select查询以了解数据库中的内容,我就无法这样做。。。这就是我的问题,我正在做的这个过程需要很长时间。