【问题标题】:Counter variable in SQLiteSQLite 中的计数器变量
【发布时间】:2010-01-05 02:20:45
【问题描述】:

我正在开发一个简单的待办事项应用程序,该应用程序在一周中的每一天都有一个列。启动时,应用程序会检查当前日期之前是否有任何未完成的任务。如果是这样,它们将被移到当前日期列的顶部。

该应用是基于云的,但使用 SQLite 数据库为离线模式备份任务。我可以通过更新它们的 date 属性轻松移动任务,但我需要每个任务的 order 属性从 0 开始递增以将它们放在顶部。

我需要能够单独在 SQLite 中定义一个计数变量,并在每次执行更新时递增它。我知道这段代码不起作用,但它是一种解释需要做什么的简单方法:

count = 0

UPDATE `tasks` 
   SET `date` = '2010-01-04', 
       `order` = `count`++ 
 WHERE `date` < '2010-01-04'

如果可能,我宁愿不使用临时表或使用 SQLite 之外的计数器。

@OMG Ponies - 我开始认为这在 SQLite 中是不可能的。

【问题讨论】:

  • 您似乎认为更新语句将在每个日期运行一次,这是不正确的。请提供您想使用的真实算法,而不是您认为的伪 SQL。
  • 有谁知道这是否可以通过使用触发器来实现?

标签: sql actionscript-3 sqlite


【解决方案1】:

我会用第二个 SQL 语句来做:

UPDATE `tasks`
SET `date` = '2010-01-04',
count = ( SELECT COUNT(`task_id`) FROM `tasks` ) + 1
WHERE `date` < '2010-01-04'

未经测试,但应该可以工作!

【讨论】:

    【解决方案2】:

    SQLite 是一个很棒的工具,但如果仅使用 SQLite 就可以做到这一点,我会感到惊讶。该应用程序对 T-SQL 的支持不是很好。

    您可能会更新记录中的现有值;从中添加或减去,但这需要记录已经按顺序排列。

    【讨论】:

      【解决方案3】:

      实际上,您可以在 Sqlite 中使用加法 - 查看 http://www.sqlite.org/lang_expr.html ;您只需要使用一个额外的 UPDATE 语句来增加计数器和一个内部查询来再次获取它。确保在 Transaction 中完成所有这些操作,否则您会遇到并发问题。

      【讨论】:

      • 能否具体评论一下会出现的并发问题?
      【解决方案4】:

      在我看来,您希望每行都有一个计数列。如果我是你,我想你可以这样打电话

      UPDATE `tasks` 
      SET 
      `date` = '2010-01-04', 
      count = count + 1
      WHERE `date` < '2010-01-04'
      

      让我知道它是如何工作的......

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-07
        • 1970-01-01
        • 1970-01-01
        • 2012-04-17
        • 2018-05-28
        • 1970-01-01
        • 2020-08-23
        • 2012-09-17
        相关资源
        最近更新 更多