【发布时间】:2015-11-21 04:47:24
【问题描述】:
让我们考虑一个场景。
一个表有 1000 行。
我用 LIMIT 100 查询了行。
查询后,表中插入了一些行。
然后,我再次查询,使用 LIMIT 100 和 OFFSET 100。
我希望结果与第一个查询无关。
我想要第一个查询后的结果。
我该怎么做?请帮忙。
【问题讨论】:
让我们考虑一个场景。
一个表有 1000 行。
我用 LIMIT 100 查询了行。
查询后,表中插入了一些行。
然后,我再次查询,使用 LIMIT 100 和 OFFSET 100。
我希望结果与第一个查询无关。
我想要第一个查询后的结果。
我该怎么做?请帮忙。
【问题讨论】:
SQL 标准没有承诺表中行的自然排序 - 新行可以插入到表的末尾或中间的任何位置。根据您的 dbms 插入行的位置(这可能取决于之前删除了哪些行),您的第二个查询可以轻松选择第一个查询中已选择的行,或者在查询之间跳过一些行。
我能想到的唯一可靠的方法是将整个表选择到一个临时表或游标中,然后从第二个记录集中一次读取 100 条记录。
您还可以在单个可序列化事务中执行所有查询(这将隐藏其他用户在您的事务期间执行的任何插入或删除操作),但即使这样也不是万无一失的解决方案。
【讨论】: