当前位置: 首页 > 知识库问答 >
问题:

mysql分页-避免丢失或重复数据到客户端

夏侯宏旷
2023-03-14

我在mySql中有一个这样的表

CREATE TABLE `usermst` (
  `userid` smallint(5) unsigned NOT NULL,
  `username` varchar(45) NOT NULL,
  `insdate` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

有如下数据

insert into usermst(userid, username)
values (1, "user 1"),
       (2, "user 2"),
       (3, "user 3"),
       (4, "user 4"),
       (5, "user 5"),
       (6, "user 6"),
       (7, "user 7"),
       (8, "user 8"),
       (9, "user 9"),
       (10, "user 10");

如果我查询有4条记录的第一页(分页),它的工作就可以了。

select * from usermst order by insdate desc, userid desc limit 0,4;

输出:

userid  username insdate
10      user 10  2016-03-08 12:32:04.239335
9       user 9   2016-03-08 12:32:04.239335
8       user 8   2016-03-08 12:32:04.239335
7       user 7   2016-03-08 12:32:04.239335

请求第二页,查询如下

select * from usermst order by insdate desc, userid desc limit 4,4;

输出:

userid  username insdate
6       user 6   2016-03-08 12:32:04.239335
5       user 5   2016-03-08 12:32:04.239335
4       user 4   2016-03-08 12:32:04.239335
3       user 3   2016-03-08 12:32:04.239335

但是,如果以某种方式删除了第1页的记录,客户端将丢失数据。或插入第1页的记录(根据我的查询排序),客户端将获取重复数据。如何防止此错误?

共有1个答案

闻人嘉颖
2023-03-14

我将使用的方法是将分页基于排序列值,但仅在遍历页面时(下一页/上一页按钮)。当希望导航到特定页码时,仍然需要使用您现有的方法,但我认为您仅描述的问题实际上是使用下一页/上一页按钮导航时的问题。

对于每个“下一页”,获取“insdate”小于上一页读取中最后一个“insdate”的所有行。

第一页:

SELECT * FROM usermst ORDER BY insdate DESC, userid DESC LIMIT 0,4;
SELECT @prevInsDate := insdate, @prevUserId := userid FROM usermst 
    ORDER BY insdate DESC, userid DESC LIMIT 3,1;

下一页(第二页):

SELECT * FROM usermst 
WHERE insdate <= @prevInsDate AND userid < @prevUserId
ORDER BY insdate DESC, userid DESC LIMIT 0,4;

SELECT @prevInsDate := insdate, @prevUserId := userid FROM usermst 
    ORDER BY insdate DESC, userid DESC LIMIT 7,1;

其中@prevInsDate和@prevUserId已声明为变量。

 类似资料:
  • 我有一个严重的问题,我没有弄清楚。我有一个表名叫做“结果”。我想要实现的是,当我插入新记录时,它会正确地插入数据库。 在这个水平上,我的脚本运行良好。但是我想第二次点击添加新结果记录时,如果之前输入了数据,那么它将显示我的数据,如果我想更新我的数据,我可以。如果以前没有输入数据,那么我会将数据插入数据库。我成功地限制用户输入重复数据,但我没有成功地在同一页上显示数据。 我有一个显示测试页面,当我点

  • 你好,我有一个简单的mysql查询,我需要显示唯一的文件名,现在查询显示重复的文件名,我想避免这种情况

  • 问题内容: 我有一个包含3列的表格- id(pk),pageId(fk),名称。我有一个PHP脚本,它将大约5000条记录转储到表中,其中大约一半是重复的,具有相同的pageId和名称。pageId和名称的组合应该是唯一的。当我遍历php中的脚本时,防止重复项被保存到表中的最佳方法是什么? 问题答案: 第一步是在表上设置唯一键: 然后,当有重复项时,您必须决定要做什么。你应该: 忽略它? 覆盖先前

  • 本文向大家介绍RabbitMQ 怎么避免消息丢失?相关面试题,主要包含被问及RabbitMQ 怎么避免消息丢失?时的应答技巧和注意事项,需要的朋友参考一下 把消息持久化磁盘,保证服务器重启消息不丢失。 每个集群中至少有一个物理磁盘,保证消息落入磁盘。

  • 试图了解发生这种情况时会发生什么。如果我们试图读取的偏移量丢失(我假设是因为kafka GC'ed the offet)和<code>auto.offset。reset=latest我们是否跳过数据到最新偏移量? 避免数据丢失的安全配置是什么?

  • 我试图Conconat 2 DataFrames,但. Join正在创建一个不需要的副本。 我试过: 但这返回了一个我理解的错误(“concat未能重新索引,仅对唯一值的索引对象有效”) 我试着: 它没有给出错误,但给出以下数据帧: 我的问题是重复的10.1和400在时间戳1520259275。它们不在原始df_bid数据框中两次,应该只在这个df中出现一次。有两行相同的时间戳是正确的,因为此时有