MariaDB中UPDATE结合replace与双参数LIMIT报1064语法错误求助
问题根源与解决办法
嘿,这个报错的核心原因其实和replace()函数一点关系都没有,纯粹是MariaDB/MySQL的UPDATE语句不支持带偏移量的双参数LIMIT语法——咱们来把这事说透:
为什么会报错?
- 咱们平时写SELECT语句时,
LIMIT offset, row_count是完全合法的,用来跳过前offset行,返回后面的row_count行; - 但对于UPDATE(还有DELETE)语句,LIMIT子句只能接受单个数值参数,这个参数的作用是指定要更新的最大行数,根本不支持
offset, row_count这种双参数的偏移量写法。你写的LIMIT 0, 200刚好踩了这个语法红线,所以触发了1064语法错误; - 而
LIMIT 0是单参数写法,语法上完全合规(当然它表示更新0行,所以不会有任何实际修改,自然也不会报错)。
怎么实现“跳过N行再更新M行”的需求?
如果你确实需要跳过前面的行,只更新后面的指定行数,可以通过子查询先筛选出目标行的唯一标识(比如你的file_id),再关联原表进行更新。举个例子,假设你要跳过前100行,更新后面200行:
UPDATE your_table t JOIN ( SELECT file_id FROM your_table ORDER BY file_id ASC LIMIT 100, 200 -- 这里在SELECT里用双参数LIMIT是合法的 ) AS target_rows ON t.file_id = target_rows.file_id SET t.your_column = replace(t.your_column, 'search_str', 'replace_str');
如果你的需求只是从第一行开始更新200行,那直接用单参数LIMIT就够了,完全没必要加偏移量:
UPDATE your_table SET your_column = replace(your_column, 'search_str', 'replace_str') ORDER BY file_id ASC LIMIT 200;
版本说明
你用的MariaDB 10.1.30确实遵循这个规则,而且直到后续的多数版本,UPDATE的LIMIT语法都只支持单参数——这是MariaDB/MySQL对SQL标准的特定实现限制,不是bug哦。
内容的提问来源于stack exchange,提问作者Thamaraiselvam
相关产品推荐
相关产品推荐

