我们希望可以定期将所有记录从一个表复制到另一个表。
现在我使用SELECT * FROM users LIMIT 2 OFFSET <offset>
来获取记录。
表格记录如下:
user_1
user_2
user_3
user_4
user_5
user_6
当我抓取第一页(user_1,user_2)时,在源表中删除了记录“user_2”。
现在我获取第二页是(user_4,user_5),第三页是(user_6)。
这导致我在目的地表中丢失了记录“user_3”。
真正的源表可能有1000 000条记录,如何有效地解决问题?
答案 0 :(得分:3)
首先,您应该在源表上使用唯一索引,并在order子句中使用它,以确保顺序或行在一段时间内保持一致。接下来,您不使用偏移,而是在最后一个元素被提取后开始。
类似的东西:
SELECT * FROM users ORDER BY id LIMIT 2;
第一次,然后
SELECT * FROM users WHERE ID > last_recieved_id ORDER BY id LIMIT 2;
接下来的。
这将不受异步删除的影响。
我没有唯一索引,但在表中有一个非唯一索引,您仍然可以使用非严格比较运算符应用上述解决方案。您将始终重新获取最后一行,它肯定会突破限制2,但它可以用于合理的值。
如果你没有索引 - 已知会引起其他不同的问题 - 唯一可靠的方法就是让一个大的选择并使用SQL游标进行分页。