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。- 如果(情况2)运行,则
INSERT
语句应为UPDATE
。- 如果(情况3)运行,则
INSERT
语句应正常运行。
if new_timestamp in my_table:
if new_hash == old_hash:
IGNORE
else:
UPDATE
else:
INSERT
非常感谢您的帮助。编辑:该行的唯一键是
timestamp
,与我最初的问题相反。时间戳永远不会改变。我将通过观察哈希知道行中的其他一些值发生了变化,但是我使用时间戳来确保我回到了正确的行中。对于我来说,情况2可能是一个REPLACE,但是如果给定时间戳的哈希值发生变化,我不想为该时间戳创建新行。时间戳将始终是唯一的。
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的主要内容,如果未能解决你的问题,请参考以下文章