MySQL删除最后N行遇语法错误,求正确实现方案
问题分析与解决办法
看起来你应该是在使用IBM i平台上的DB2数据库(从报错码SQL0199能判断出来),咱们来拆解你遇到的语法问题,再给出正确的实现方式:
为什么你的两段SQL会报错?
第一段SQL的错误
DELETE FROM SCHEMA ORDER BY PID DESC LIMIT 26000;
DB2 for i的DELETE语句不支持直接在主语句中使用ORDER BY和LIMIT——这是MySQL、PostgreSQL这类数据库的语法逻辑,DB2(尤其是IBM i版本)的语法规则里,DELETE主语句只能跟WHERE、WITH这类关键字,所以会抛出SQL0199错误,提示ORDER关键字不符合预期。
第二段SQL的错误
DELETE FROM SCHEMA WHERE PID IN (SELECT PID FROM (SELECT PID FROM SCHEMA ORDER BY PID DESC limit 26000) a );
你尝试用嵌套子查询绕开主语句的限制,但问题在于:DB2 for i同样不支持LIMIT关键字,这个语法不是DB2的标准写法,所以依然会报错。
正确实现删除最后N行的方法
要删除按PID降序排列的前26000行(也就是你说的“最后N行”),可以用DB2标准的FETCH FIRST n ROWS ONLY语法来限制子查询的行数,或者用窗口函数来标记目标行。
方法1:用FETCH FIRST简化实现
这是最直接的写法,适合大多数场景:
-- 先替换SCHEMA为你的真实表名 DELETE FROM SCHEMA WHERE PID IN ( SELECT PID FROM SCHEMA ORDER BY PID DESC FETCH FIRST 26000 ROWS ONLY );
方法2:用窗口函数ROW_NUMBER()(更灵活)
如果需要更复杂的筛选逻辑(比如按多个字段排序),可以用窗口函数标记行号,再筛选行号≤26000的记录:
DELETE FROM SCHEMA WHERE PID IN ( SELECT PID FROM ( SELECT PID, ROW_NUMBER() OVER(ORDER BY PID DESC) AS row_num FROM SCHEMA ) AS temp WHERE row_num <= 26000 );
注意事项
- 记得把语句中的
SCHEMA替换成你的真实表名(你这里应该是写错了,SCHEMA是模式名,不是表名); - 删除前建议先执行子查询部分(比如单独运行
SELECT PID FROM SCHEMA ORDER BY PID DESC FETCH FIRST 26000 ROWS ONLY),确认要删除的行符合预期,避免误删; - 如果表的数据量很大,建议给
PID字段加索引,提升查询和删除的性能。
内容的提问来源于stack exchange,提问作者Harold Decapia




