sqlite3:对多个唯一列进行INSERT或IGNORE或UPDATE

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sqlite3:对多个唯一列进行INSERT或IGNORE或UPDATE相关的知识,希望对你有一定的参考价值。

我的[[简体数据库看起来像这样:

CREATE TABLE my_table(hash TEXT, timestamp DATE, value1 TEXT, value2 REAL, UNIQUE(hash, timestamp));
hash列是该行中所有内容的MD5哈希。

问题

脚本将在表中放置以下示例行:

INSERT INTO my_table VALUES("7494ab07987ba112bd5c4f9857ccfb3f", "2019-12-19", "temp", 1);

然后脚本将在一小时后运行,并且value2可能已更改,也可能未更改。这等效于hash更改或保持不变。如果哈希在给定日期已更改,我想用新值更新该行。

作为一个具体示例,下面是可能在上面的语句之后1小时运行的三个语句。

(case 1) INSERT INTO my_table VALUES("7494ab07987ba112bd5c4f9857ccfb3f", "2019-12-19", "temp", 1); or... (case 2) INSERT INTO my_table VALUES("64a5dcbe3f4af29ca58b8d99b1c3a9f2", "2019-12-19", "temp", 2); or... (case 3) INSERT INTO my_table VALUES("514292c37cc92b2ee2cd797328bed2d5", "2019-12-20", "temp 2", 3);

    如果(情况1)运行,则INSERT语句应为IGNORE d。
  1. 如果(情况2)运行,则INSERT语句应为UPDATE
  2. 如果(情况3)运行,则INSERT语句应正常运行。
  • 对于给定的时间戳(new_timestamp),它可能已经或可能不在我的表中,并且对于哈希(new_hash),我需要一条语句来执行以下操作:

    if new_timestamp in my_table: if new_hash == old_hash: IGNORE else: UPDATE else: INSERT

    非常感谢您的帮助。

    编辑:该行的唯一键是timestamp,与我最初的问题相反。时间戳永远不会改变。我将通过观察哈希知道行中的其他一些值发生了变化,但是我使用时间戳来确保我回到了正确的行中。对于我来说,情况2可能是一个REPLACE,但是如果给定时间戳的哈希值发生变化,我不想为该时间戳创建新行。时间戳将始终是唯一的。

  • 答案
    假设时间戳定义为唯一的(与当前问题的详细信息不匹配),添加UPSERT子句将满足所有三种情况:

    INSERT INTO my_table (hash, timestamp, value1, value2) VALUES ('7494ab07987ba112bd5c4f9857ccfb3f', '2019-12-19', 'temp', 1) ON CONFLICT (timestamp) DO UPDATE SET hash = excluded.hash, value1 = excluded.value1, value2 = excluded.value2 WHERE hash != excluded.hash;

    (FYI,标准字符串定界符是单引号',而不是双引号"。]

    以上是关于sqlite3:对多个唯一列进行INSERT或IGNORE或UPDATE的主要内容,如果未能解决你的问题,请参考以下文章

    sql执行insert保证数据唯一

    SQLite3 INSERT 查询上的随机语法错误

    SQLite3 和 last_insert_rowid

    MySQL索引

    SQLITE3 - 删除具有相同值的多个列的行

    postgresql----数据库表约束----UNIQUE