【问题标题】:SQLite INSERT OR IGNORE doesn't ignore duplicatesSQLite INSERT OR IGNORE 不会忽略重复项
【发布时间】:2020-09-25 04:13:39
【问题描述】:

我正在编写一个 java 程序来组合两个具有相同架构的数据库。这是 SQLite 或我的查询的问题,而不是 Java 代码,因为我能够在 DB Browser 应用程序中完全复制它。

我有 2 个数据库:一个正在合并,一个是目标。

我最初连接到要合并的数据库,然后将目标数据库附加为“dest”。 我发出以下查询来复制数据:

INSERT or IGNORE into dest.AnalogInput SELECT * from AnalogInput where timestamp >= 1600824664131000000 AND timestamp <= 1600824664131000000

这工作正常并插入数据。如果我在相同的数据上再次运行它,它会在目标数据库中插入一个副本。我认为“OR IGNORE”的目的是为了防止重复?我的查询不正确还是我对 OR IGNORE 的理解不正确?

编辑:是的,我知道时间戳是相同的 - 这是一个通用查询,我只是在单个时间戳上使用几个样本进行测试。

谢谢!

【问题讨论】:

  • dest.AnalogInput 中是否有任何唯一约束?
  • 没有。该数据库由 RTI DDS Recorder 自动生成。 DB Browser 中列出的 Create 语句为:CREATE TABLE "AnalogInput" ("SampleInfo_source_timestamp" INTEGER,"machineId" INTEGER,"ioId" INTEGER,"value" REAL)
  • 那么没有什么可以阻止插入。
  • 你能在事后将它添加到数据库中吗?
  • 检查我的答案。

标签: sqlite insert


【解决方案1】:

INSERT OR IGNORE 仅在表中有唯一约束时有效。
由于没有并且您无法添加任何内容,因为 SQLite 不是那么灵活,因此您想要做的唯一方法是这样的:

INSERT or IGNORE INTO dest.AnalogInput 
SELECT * FROM AnalogInput WHERE ....
EXCEPT
SELECT * FROM dest.AnalogInput

【讨论】:

  • 那么,如果我要以某种方式更改 create 语句,我将如何构造唯一关键字以获得相同的结果?
  • create table ......, unique(col1, col2, .....)。由于您希望所有列的组合都是唯一的,因此您必须在关键字 UNIQUE 之后枚举括号内的所有列。
  • 而且空值不被认为是相等的。因此,可以插入除 1 列之外的所有列中具有完全相同值的 2 行,而在另一列中插入空值。
猜你喜欢
  • 2013-04-12
  • 2021-06-18
  • 1970-01-01
  • 1970-01-01
  • 2015-01-04
  • 1970-01-01
  • 2019-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多