无主键SQLite表的记录更新方法咨询
无主键SQLite表的记录更新方案
问题背景
现有无主键SQLite表,对应实体类:
public class Person { public string PersonId { get; set; } public string ConfirmationNumber { get; set; } public string Sid { get; set; } }
已插入一条记录:
Person p = new Person(); p.PersonId = "0"; // 注:原代码中string类型直接赋值数字0存在类型不匹配,建议修正为字符串格式 p.ConfirmationNumber = "ABC-DEF-GHJ"; p.Sid = "19240"; await DatabaseAsync.InsertAsync(p);
需将该记录更新为:
p.PersonId = "2047"; p.ConfirmationNumber = "ABC-DEF-GHJ"; p.Sid = "19240";
已知ConfirmationNumber与Sid的组合可唯一标识记录,且所用SQLite库无Update.With()/Delete.With()方法,无主键无法使用Replace()。
解决方案
方案1:执行原生UPDATE语句(推荐)
直接通过组合唯一条件定位记录并更新,无需额外操作,效率最高:
string updateQuery = "UPDATE Person SET PersonId = ? WHERE ConfirmationNumber = ? AND Sid = ?"; await DatabaseAsync.ExecuteAsync(updateQuery, "2047", "ABC-DEF-GHJ", "19240");
方案2:删除原记录后插入新记录
先通过组合条件删除旧记录,再插入更新后的实体:
// 删除旧记录 string deleteQuery = "DELETE FROM Person WHERE ConfirmationNumber = ? AND Sid = ?"; await DatabaseAsync.ExecuteAsync(deleteQuery, "ABC-DEF-GHJ", "19240"); // 插入新记录 Person updatedPerson = new Person { PersonId = "2047", ConfirmationNumber = "ABC-DEF-GHJ", Sid = "19240" }; await DatabaseAsync.InsertAsync(updatedPerson);
补充说明
- 方案1是最优选择,避免了删除插入的额外开销;
- 方案2适用于需要批量更新多字段、或业务逻辑要求重置记录的场景;
- 长期维护建议将
ConfirmationNumber与Sid设置为复合主键,可直接使用SQLite库内置的更新/删除方法,简化后续操作。
内容的提问来源于stack exchange,提问作者Austin
相关产品推荐
相关产品推荐

