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
相关产品推荐
相关产品推荐

