You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQLite复合主键表:仅更新Age列且保留Address,不存在则插入

解决方案:SQLite复合主键下的UPSERT操作

你遇到的问题是REPLACE INTO的特性导致的——它会先删除冲突的旧行,再插入新行,所以未指定的Address列会被设为NULL。SQLite 3.24.0及以上版本支持ON CONFLICT语法(即UPSERT),正好能满足你的需求:仅更新指定列,保留其他列原有值,不存在则插入。

针对你的复合主键(FirstName+LastName),正确的SQL语句如下:

INSERT INTO answers
    (FirstName, LastName, Age)
VALUES
    (:first_name, :last_name, :age)
ON CONFLICT(FirstName, LastName) DO UPDATE
SET Age = excluded.Age;

关键说明:

  • ON CONFLICT(FirstName, LastName):明确指定触发冲突的复合主键列组合,当这两个列的组合值已存在时,执行后续的DO UPDATE操作。
  • excluded.Age:excluded是SQLite的特殊关键字,指代本次INSERT操作中试图插入的Age值,用它来更新现有行的Age列。
  • 由于DO UPDATE中只指定了Age列,Address列会保持原有值不变;如果是新插入的行,Address会自动使用默认值NULL(符合你的需求)。

内容的提问来源于stack exchange,提问作者Jack M

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 10:15:30