sqlite如何同时使用update和limit?

yquaqz18  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(699)

我想要的是只更新表中的一行,其中所有条目在开始时都是零。
在网上找了一会儿答案后,我发现 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/SELECT 而且在 WHERE ?
我的表只有一列。

mbskvtky

mbskvtky1#

你可以得到最小值(或最大值) rowid 满足条件并使用它仅更新一行的行数:

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

mkh04yzy2#

作为一个初学者:为了让你的问题变得有意义,你需要一个列来定义行的顺序,这样你就可以一致地判断应该更新哪个记录。这通常是表的主键。假设这个列被称为 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 SQLITE_ENABLE_UPDATE_DELETE_LIMIT 启用(正如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'
)

相关问题