我需要对SQLite数据库执行UPSERT/INSERT或UPDATE.

有一个INSERT或REPLACE命令,在许多情况下可能很有用.但是,如果您因为外键的原因而想让id保持自动递增,那么它不会工作,因为它会删除该行,创建一个新的行,然后这个新行就会有一个新的ID.

这是一张桌子:

玩家-(id上的主键,用户名唯一)

|  id   | user_name |  age   |
------------------------------
|  1982 |   johnny  |  23    |
|  1983 |   steven  |  29    |
|  1984 |   pepee   |  40    |

推荐答案

这是一个迟来的回答.从2018年6月4日发布的SQLIte 3.24.0开始,终于有了遵循PostgreSQL语法的对UPSERT子句的支持.

INSERT INTO players (user_name, age)
  VALUES('steven', 32) 
  ON CONFLICT(user_name) 
  DO UPDATE SET age=excluded.age;

注:对于那些必须使用早于3.24.0的SQLite版本的用户,请参考下面的this answer(由我@MarqueIV发布).

但是,如果您确实可以 Select 升级,您可以 Select 升级,因为与我的解决方案不同的是,这里发布的解决方案在一条语句中就实现了所需的行为.此外,您还可以获得更新版本通常附带的所有其他功能、改进和错误修复.

Database相关问答推荐

如何高效地存储 100 万个单词并通过starts_with、contains 或ends_with 进行查询?

数据库是序列图中的控制器还是边界?

sql-dump 有什么用?

需要未提供的参数@ID?

时间数据库设计,有一个转折(live vs draft rows)

使用 ContentValues 和更新方法更新 sql 数据库

按纬度/经度进行半径搜索

PostgreSQL 是否对只读事务进行了一些性能优化

有没有办法在一个脚本中创建多个触发器?

您如何在数据库中构造配置数据?

是否有一个 postgres 命令来列出/删除所有materialized视图?

执行语句还是运行脚本?

PostgreSQL 哈希索引

数据库模式与数据库表空间?

Django Atomic Transaction 是否锁定数据库?

如何在 Google AppEngine 上实现自动增量

如何更正此 sql 连接上的相关名称?

我可以在 /sdcard 上下载 SQLite 数据库并从我的 Android 应用程序访问它吗?

我应该标准化我的数据库吗?

是否有用于 postgresql 的数据可视化工具,它也能够显示模式间关系?