SQLite UPSERT /更新或插入

2023-12-02

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

有一个命令 INSERT OR REPLACE 在许多情况下很有用。但是,如果您想由于外键而保留自动增量的 id,则它不起作用,因为它会删除该行,创建一个新行,因此该新行具有新的 ID。

这将是表格:

玩家 - (id 上的主键,user_name 唯一)

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

这是一个迟到的答案。从2018年6月4日发布的SQLite 3.24.0开始,终于支持UPSERT子句遵循 PostgreSQL 语法。

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

注意:对于需要使用3.24.0之前的SQLite版本的用户,请参考这个答案下面(由我发布,@MarqueIV)。

但是,如果您确实可以选择升级,那么您强烈鼓励这样做与我的解决方案不同,此处发布的解决方案在单个语句中实现了所需的行为。此外,您还可以获得最新版本通常附带的所有其他功能、改进和错误修复。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQLite UPSERT /更新或插入 的相关文章

  • Google 的 Bigtable 与关系数据库 [重复]

    这个问题在这里已经有答案了 重复项 为什么应该使用基于文档的数据库而不是关系数据库 https stackoverflow com questions 441441 why should i use document based datab
  • ROWID 整数主键自动增量 - 如何插入值?

    我用 Java 创建了一个 SQLite 表 create table participants ROWID INTEGER PRIMARY KEY AUTOINCREMENT col1 col2 我尝试添加行 insert into pa
  • 清除表中的所有行将身份规范重置为零并且不影响外键?

    我们已经创建了数据库框架以及所有关系和依赖关系 但表内部只是虚拟数据 我们需要删除这些虚拟数据 并开始添加正确的数据 我们怎样才能清除所有内容并将主键 IsIdentity 是 保留为零 并且不影响外部表关系结构 多谢 您可以采取以下步骤
  • 使用 PHP 代码和 HTML 表单将 Excel (.csv) 导入 MySQL

    我知道还有其他类似的帖子 但每个人都建议直接在 PHPMyAdmin 中将其导入 MySQL 这工作完美 但我需要通过 HTML 表单导入 PHP 到 MySQL 我想要一个收集文件的 HTML 表单 然后将该文件传递给 PHP 脚本 我想
  • 需要有关使用 PHP 在 mysql 数据库中插入逗号分隔数据的帮助

    数据库表中已有的演示数据 INSERT INTO csvtbl ID SKU Product Name Model Make Year From Year To VALUES 1 C2AZ 3B584 AR Power Steering P
  • 在同一个表上组合两个 SQL SELECT 语句

    我想结合这两个 SQL 查询 SELECT FROM Contracts WHERE productType RINsell AND clearTime IS NULL AND holdTime IS NOT NULL ORDER BY g
  • 数据库字段的标准长度列表

    我正在设计一个数据库表并问自己这个问题 名字字段应该有多长 有人有最常见字段 例如名字 姓氏和电子邮件地址 的合理长度列表吗 我刚刚查询了我的数据库 其中包含美国数百万客户 最大值名长度是 46 我选择 50 当然 其中只有 500 个超过
  • 非规范化如何提高数据库性能?

    我听说过很多关于非规范化的内容 它是为了提高某些应用程序的性能而进行的 但我从来没有尝试过做任何相关的事情 所以 我只是好奇 规范化数据库中的哪些地方会使性能变差 或者换句话说 非规范化原则是什么 如果我需要提高性能 如何使用此技术 非规范
  • 在 SQL 语句的 WHERE 子句中将 string 转换为 int

    我想实现这个目标 SELECT FROM linkledger WHERE toInt reputation gt 100 但是函数 toInt 不存在 有吗 我现在发现了这个 但不起作用 这意味着我有一个更根本的问题 因为这是正确的 SE
  • 从数据库 MYSQL 和 Codeigniter 获取信息

    如果你们需要其他信息 上一个问题就在这里 从数据库中获取信息 https stackoverflow com questions 13336744 fetching information from the database 另一个更新 尽
  • 如何在asp.net中按下按钮后刷新Gridview

    我正在尝试制作一个简单的图书馆数据库 我在网格视图中列出搜索结果 然后有一个文本框和一个按钮 用户输入 isbn 并单击贷款按钮 然后 如果有足够数量的物品 itemNumber gt 0 则由用户借出 这是用户界面的屏幕截图 我的问题是
  • cv2.imdecode 始终返回 None

    我正在从存储 JPEG 图像的 sqlite BLOB 读取二进制数据 sqlite3 Binary 图像被写入数据库 img cv2 imread images image jpg c execute INSERT INTO pictur
  • 如何将现有的 SQLite3 数据库导入 Room?

    好吧 我在桌面上使用 SQLite3 创建了一个只需要读取的某些信息的数据库 我正在制作的应用程序不需要在此表中插入或删除信息 我在 Room 数据库层上做了相当多的谷歌搜索 所有文档都需要在构建应用程序时在 Room 中创建一个新的数据库
  • 多级排序

    我有一个表 其中包含一些记录 其中包含名称 评级等字段 我首先想要根据评级将结果限制为 20 进行排序 然后在此结果集上想要进一步应用基于名称的排序 我知道要排序我们需要使用像这样的查询 Select from table order by
  • 如何一次执行多个 RSQLite 语句或如何转储整个文件?

    使用 RSQLite 构建 SQLite 数据库 我想一次发送多个语句 这可能吗 为什么要做这些not work sql lt readLines createtables sql dbSendQuery con sql 和 sql lt
  • 在准备另一个Statement之前是否有必要关闭PreparedStatement

    是否有必要在一个db getConnection 中关闭ResultSet和PreparedStatement 对于下面的例子 Connection conn db getConnection PreparedStatement pstmt
  • iPhone,sqlite3,如何尽可能用几行代码确定一个表是否已经存在?

    在开始再次向表添加数据之前 如何以尽可能少的代码行确定表中已经存在 如果直接使用sqlite 可以使用以下查询来查看表是否已经存在 SELECT name FROM sqlite master WHERE type table AND na
  • sqlite.net + monotouch = SIGSEGV 崩溃

    我们正在使用以下内容 Xamarin 3 Xamarin 表单 单点触控 sqlite net iOS模拟器 硬件 该应用程序在后台线程上与服务器同步数据 整个应用程序只共享一个 SQLite 连接对象 前台查询在后台同步运行的同时执行 所
  • 如何使用索引更改表的列?

    我想将带有某些索引的表中 a 列的列大小从 varchar 200 更改为 varchar 8000 我应该如何进行 既然是VARCHAR你正在增加尺寸 然后简单地ALTER TABLE ALTER COLUMN https learn m
  • ListView 和 CursorAdapter 对于大量数据的性能问题

    我在 sqlite 表中有大约 4k 行 表有 7 列 我用自己的 CursorAdapter 创建了工作 ListView 查询是这样的SELECT FROM table ORDER BY column DESC 表有第一列 id INT

随机推荐