sqlite“on conflict”在某些版本上不起作用

qltillow  于 2021-07-29  发布在  Java
关注(0)|答案(1)|浏览(775)

我在一个插件环境中工作,在这个环境中我有运行时可用的sqlite驱动程序。不过,我最近开始编写一些sql语句,这些语句利用了“on conflict”特性,效果很好。但我注意到,在使用sqlite驱动程序的不同版本时,该特性(关于冲突)不能正常工作,或者根本不存在。它在3.25.2及更高版本中运行良好,这是我正在使用的软件的新版本所提供的功能,但是当我尝试支持旧版本(3.21.0.1驱动程序的阴影)时,我在“on conflict”附近遇到了一个sql语法错误。声明如下:

INSERT INTO data(player_uuid, player_name, flags_domains, flags_ipv4, flags_words)
      VALUES (?, ?, ?, ?, ?)
      ON CONFLICT(player_uuid)
      DO UPDATE SET flags_words = flags_words + 1, player_name = ?;

如前所述,在新的驱动程序上它确实正常工作,我甚至尝试在sqlite changelog网站上搜索一些东西,但我没有找到它不工作的原因,任何人都知道我如何解决“on conflict”?

nlejzf6q

nlejzf6q1#

如果您的sqlite版本不支持upsert,那么您可以使用2条语句执行您想要的操作。
第一次更新:

UPDATE data
SET flags_words = flags_words + 1, player_name = ?
WHERE player_uuid = ?;

如果 player_uuid 存在于表中,则该行将被更新。
如果它不存在,什么也不会发生。
然后尝试插入 INSERT OR IGNORE :

INSERT OR IGNORE INTO data(player_uuid, player_name, flags_domains, flags_ipv4, flags_words)
VALUES (?, ?, ?, ?, ?);

如果 player_uuid 存在于表中不会发生任何事情。
如果不存在,则插入新行。

相关问题