如何在不丢失记录的情况下查询数据库?

时间:2016-10-13 09:01:46

标签: java database

我们希望可以定期将所有记录从一个表复制到另一个表。

现在我使用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条记录,如何有效地解决问题?

1 个答案:

答案 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游标进行分页。