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

无主键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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 19:12:38