如何将LIMIT添加到用户生成的SQL查询

时间:2019-01-03 22:57:57

标签: mysql sql

我建立了一个查询编辑器,用户可以在其中输入查询。但是,它需要将用户的输入限制为1000个结果,否则用户可以输入:

SELECT * FROM mybigtable

它可以尝试下载10亿个结果。

实施限制的最佳方法是什么?我想到的第一种方法是:

SELECT * FROM (
    user-query
) x LIMIT 1000

但是,这将在执行实际限制之前执行整个查询(并且可能要花很长时间)。对用户的sql输入实施严格限制的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

这个评论太长了。

我认为没有通用的解决方案。

SELECT * FROM ... LIMIT 1000语句中包装用户查询很有吸引力,但是;

  • 在某些情况下,它可能会生成无效的SQL,例如,如果用户查询包含CTE(必须在查询的开始处放置WITH子句)
  • 虽然它很乐意限制返回给用户的行数,但不会阻止数据库扫描整个结果集

第二种用例的典型解决方案是根据自动递增的整数列(通常是表的主键)过滤行。但这使得通用变得更加困难。

简而言之:远距离操作SQL是很棘手的:如果您想要针对用例的完整解决方案,请给自己一个真正的查询生成器(或至少一个SQL解析器)。