【问题标题】:SQLite how to use UPDATE and LIMIT at the same time?SQLite 如何同时使用 UPDATE 和 LIMIT?
【发布时间】:2020-10-02 08:38:52
【问题描述】:

我正在寻找的是只更新表中的 1 行,其中所有条目一开始都是零。
在网上浏览了一段时间后,我发现LIMIT 应该可以与UPDATE 一起使用,但也不完全正确。从我所见,我应该用SQLITE_ENABLE_UPDATE_DELETE_LIMIT“启用”一些东西,但我不知道那是什么,也不知道我应该在何时何地完成它。
对于我的情况,我还看到了不同的解决方案,例如:

UPDATE Table_name
Set Column_name= new_value
WHERE Column_name IN 
(   SELECT Column_name
    FROM Table_name
    WHERE Column_name = initial_value
    LIMIT 1
)

但是,出于某种原因,这对我不起作用。 LIMIT 1 完全没有效果,因为整个列都被修改了。

是因为我在SET/SELECTWHERE 中使用了相同的列名吗?

我的表格只包含一列。

【问题讨论】:

  • 您必须首先构建一个自定义版本的 sqlite3.c 并启用更新限制,然后使用定义的 SQLITE_ENABLE_UPDATE_DELETE_LIMIT 编译它。如果您对 C 和从源代码构建东西感到满意,这很容易。如果您使用其他语言?祝你好运。

标签: sql sqlite sql-order-by sql-delete sql-limit


【解决方案1】:

首先:要使您的问题完全有意义,您需要一个定义行顺序的列,这样您就可以始终如一地判断应该更新哪条记录。这通常是表的主键。我假设这个专栏叫id

然后,您可以将查询编写为:

update table_name
set column_name = 'new value'
where column_name = 'initial value'
order by id
limit 1

如果您没有主键列,技术上可以删除order by 子句。将更新任意一行。

update table_name
set column_name = 'new value'
where column_name = 'initial value'
limit 1

请注意,要使其正常工作,您需要启用选项 SQLITE_ENABLE_UPDATE_DELETE_LIMIT 编译 SQLite(这并不容易,正如 Shawn 和 forpas 所评论的那样)。

如果您没有该选项但您有一个主键列,那么您可以使用子查询进行过滤:

update table_name
set column_name = 'new value'
where id = (
    select min(t1.id) 
    from table_name t1 
    where t1.column_name = 'initial value'
)

【讨论】:

  • SQLite 不支持更新语句中的 order by 或 limit:sqlite.org/lang_update.html
  • @forpas: 除非它是用选项SQLITE_ENABLE_UPDATE_DELETE_LIMIT编译的...
  • 阅读 Shawn 在问题下的评论和sqlite.org/compile.html 这一切都适用于 SQLite 的自定义版本。
  • @forpas:理解。我用更多细节和替代解决方案更新了我的答案(虽然需要主键)。
【解决方案2】:

您可以获得满足您条件的行的最小(或最大)rowid 并使用它来仅更新 1 行:

UPDATE Table_name
Set Column_name= new_value
WHERE rowid = (   
  SELECT MIN(rowid)
  FROM Table_name
  WHERE Column_name = initial_value
)

【讨论】:

  • 非常感谢,它运行良好。这正是我所需要的。
猜你喜欢
  • 2014-09-10
  • 2011-05-16
  • 2010-11-12
  • 1970-01-01
  • 1970-01-01
  • 2011-02-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多