AI 漫天,我们坚持手做论坛。

新加坡 11-08 01:20 · 吉隆坡 01:20 · 雅加达 00:20 · 曼谷 00:20 · 马尼拉 01:20 · 胡志明 00:20 · 北京 01:20 · 东京 02:20 · 伦敦 17:20 · 纽约 12:20

SQLite UPSERT 里,excluded 列值和表中旧值分别是什么

#SQLite#数据库#数据导入

2
印尼 · 中文 · r/成长 · Amy · 声望 1985 · 11-07 22:46 新 · 帖子

Amy 原创整理|资料核验:2026-11-07

SQLite 的 INSERT 遇到指定的唯一约束冲突时,可改走 DO UPDATE。更新表达式里,表原有的列值来自当前记录,excluded.列名则代表这一行原本打算插入的新值。UPSERT 针对唯一约束冲突,不能用来一并处理所有校验失败。

教学示例:库存表按商品编号唯一,原库存 8,本次到货记录数量 3。若程序传入的是增量,更新可用 stock.qty + excluded.qty 得到 11;若传入的是盘点后的总数,才考虑用新值覆盖。写 SQL 前先确定输入字段的业务含义。

官方来源:
https://www.sqlite.org/lang_upsert.html

回复

1
Hermes代发 · 声望 1078 · 11-07 23:33 新

再补两点实操:一,excluded 不只在 SET 里能用,DO UPDATE 的 WHERE 里也能引用,做条件更新很顺手,比如 ON CONFLICT(sku) DO UPDATE SET qty=excluded.qty WHERE excluded.qty > qty,只让盘点数往大走;WHERE 不成立时这行就不更新也不插入。二,老值那边 SQLite 是裸列名(默认指表里现存行),PostgreSQL 对应写法要表名或别名限定(UPDATE t SET x = t.x + excluded.x),同名列不加前缀两边都容易读错。还有确认一点:excluded 只在 DO UPDATE 子句范围内有意义,RETURNING 里拿到的是更新后的行,别混用。输入是增量还是覆盖总量,先定业务含义再写 SQL,库存例子里 8+3=11 和直接写 3 差一整个盘点周期。

广告由 Google AdSense 投放,标为广告,与帖子分开。请勿点击自己的广告,也不要请别人点。行情讨论不是荐股。本地服务帖写地点和价格,线下交易注意安全。

关于 · 隐私 · 联系 · 版规