Sql 偏移量和限制语法错误

Sql 偏移量和限制语法错误,sql,mariadb,Sql,Mariadb,这里怎么了 phpMyAdmin update posts set pos = 'right' where pos = 'below' limit 4 offset 10; 我还尝试: update posts set pos = 'right' where pos = 'below' offset 10 limit 4; update posts set pos = 'right' limit 4 offset 10; update posts set pos = 'right' offse

这里怎么了

phpMyAdmin

update posts set pos = 'right' where pos = 'below' limit 4 offset 10;
我还尝试:

update posts set pos = 'right' where pos = 'below' offset 10 limit 4;
update posts set pos = 'right' limit 4 offset 10;
update posts set pos = 'right' offset 10 limit 4;
始终存在相同的错误:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'offset 10' at line 1

限制可与更新一起使用,但只能与行计数一起使用

因此,下面的查询将无限制地正常工作

update posts set pos = 'right' where pos = 'below'
请检查下面的链接有一些相同的优点


根据@Barmar的建议,在询问之前,请检查syntex并对此进行少量搜索。:)

LIMIT可与更新一起使用,但只能与行计数一起使用

因此,下面的查询将无限制地正常工作

update posts set pos = 'right' where pos = 'below'
请检查下面的链接有一些相同的优点


根据@Barmar的建议,在询问之前,请检查syntex并对此进行少量搜索。:)

假设您的
posts
表具有
id
主键,您可以:

update  posts 
set     pos = 'right' 
where   id in
        (
        select  id
        from    (
                select  id
                from    posts
                where   pos = 'below' 
                order by
                        id
                limit   4
                offset  10
                ) sub
        )
为了解决MySQL的
还不支持'LIMIT&IN/ALL/ANY/SOME子查询'
错误,需要使用双个子查询。喜欢
Raymond Nijland评论说,MySQL通常以主键顺序返回行,但是如果没有的顺序,就不能严格依赖于主键顺序

假设您的
posts
表具有
id
主键,您可以:

update  posts 
set     pos = 'right' 
where   id in
        (
        select  id
        from    (
                select  id
                from    posts
                where   pos = 'below' 
                order by
                        id
                limit   4
                offset  10
                ) sub
        )
为了解决MySQL的
还不支持'LIMIT&IN/ALL/ANY/SOME子查询'
错误,需要使用双个子查询。喜欢
Raymond Nijland评论说,MySQL通常以主键顺序返回行,但是如果没有的顺序,就不能严格依赖于主键顺序

正如Barmar在评论中所说,在更新查询中不能使用带限制的偏移量

替换的最佳方法

update posts set pos = 'right' where pos = 'below' limit 4 offset 10;
假设您有一个带有主键和自动递增选项的id列。。这应该类似于使用
限制4偏移量10
限制10。4

p.s请注意,id必须从11递增到14,且不包含任何已删除的id


正如Barmar在评论中所说,在更新查询中不能使用带限制的偏移量

替换的最佳方法

update posts set pos = 'right' where pos = 'below' limit 4 offset 10;
假设您有一个带有主键和自动递增选项的id列。。这应该类似于使用
限制4偏移量10
限制10。4

p.s请注意,id必须从11递增到14,且不包含任何已删除的id



你不能将
OFFSET
UPDATE
一起使用,只能使用
LIMIT
。在这里阅读语法:当你遇到语法错误时,为什么不首先阅读语法文档?@Barmar,多么愚蠢的限制。非常感谢。除此之外,使用LIMIT with ORDER BY也没有意义,因为MySQL可以自由地以任意顺序返回/更新记录,而不必使用ORDER BY。您不能将
OFFSET
update
一起使用,只能使用
LIMIT
。请阅读此处的语法:当出现语法错误时,为什么不首先阅读语法文档?@Barmar,多么愚蠢的限制。非常感谢。除此之外,使用LIMIT with ORDER BY也没有意义,因为MySQL可以自由地按任意顺序返回/更新记录,而无需按“MySQL通常以主键顺序返回行”返回。是的,众所周知InnoDB以主键顺序返回。MyISAM遵循表数据中的物理顺序。“MySQL通常以主键顺序返回行”是的,InnoDB以主键顺序返回。MyISAM遵循表数据中的物理顺序。这依赖于具有增量
id
值的行,如果从表中删除行,则会中断@Andomar edited mine answer,因此该范围内的删除不会对更新的记录产生影响limit@bonaca我更新了这个答案,因为安德奥马尔的评论。。使用最新查询,因为在表上使用硬删除时,该查询更稳定。不能依赖
id
等于行数。在更新的查询中,如果前10行中的一行被删除,则更新不会从第10行开始。这取决于具有增量
id
值的行,如果从表中删除行,则会中断@Andomar编辑的我的答案,因此在该范围内的删除不会对更新的记录产生影响limit@bonaca我更新了这个答案,因为安德奥马尔的评论。。使用最新查询,因为在表上使用硬删除时,该查询更稳定。不能依赖
id
等于行数。在更新的查询中,如果前10行中的一行被删除,则更新不会从第10行开始