【问题标题】:What is the best way to update a known row in SQLite?在 SQLite 中更新已知行的最佳方法是什么?
【发布时间】:2021-03-27 13:31:28
【问题描述】:

例如,如果我想在会话期间频繁更新用户的分数, 有没有比 - UPDATE score FROM [databaseName] WHERE name = [username]

更高效的方法

当先前找到值的位置时,我觉得我不应该持续搜索整个数据库。

提前致谢

【问题讨论】:

  • sql中没有值的位置这样的东西。

标签: sql database sqlite unity3d


【解决方案1】:

如果您在name 上有索引,您将不会搜索整个数据库:

create index idx_<table>_name on <table>(name);

其中&lt;table&gt; 是您所指的的名称,而不是数据库的名称。

顺便说一下,如果您想更新表格,您可以使用update,而不是select。但是update仍然可以使用索引。

【讨论】:

  • 哇,你的速度真快!非常感谢,我试试看。刚回来编辑我的问题中的“选择”错误,但你来得太快了:)
【解决方案2】:

您可以在此处使用属性,您可以在需要时仅搜索和更新数据库。

private int score;
        public int Score
        {
            get
            {
                score = searchDatabase();
                return score;
            }
            set
            {
                UpdateDatabase(value);
                score = value;
            }
        }
    
    
    Debug.Log(Score);

【讨论】:

  • 谢谢,但这仍然需要我每次需要更新分数时搜索整个数据库,对吗?
  • 在表而不是数据库中搜索。如果你愿意,你只能在比赛结束和最高分时更新分数,而不是每次分数发生变化时更新。
  • 谢谢,是的,我想过类似的事情。但实际上我需要在数据库中不断更新以进行测试。假设您可以在多人游戏的背景下考虑它
  • 好吧,如果有分数更新并且那一刻你抓住了分数而不是每一帧都是昂贵的,你可以让一个代表听其他玩家。
  • 或者您可以创建一个更新分数的游戏管理器,然后让您的玩家客户端委托订阅该事件。
【解决方案3】:

唯一想到的与您提到的值的位置相似的是具有您搜索的值的行的主键列的值。
所以,如果表中的主键是id,而你只有这个人的name,你可以查询一次得到该行的id

SELECT id FROM tablename WHERE name = ?

然后在所有后续更新中使用 id

UPDATE tablename SET score = ? WHERE id = ? 

这是进行更新的最快方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    相关资源
    最近更新 更多