mysql 限制崩溃,导致数据交互

mysql limit collapse, which result in data interaction

我使用limit offset, num按页获取数据。但是页面之间的数据是交互的,从主键可以看出course_id.

select version();
+---------------------+
| version()           |
+---------------------+
| 10.3.13-MariaDB-log |
+---------------------+
show index from sc_base_course;
+----------------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table          | Non_unique | Key_name  | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+----------------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| sc_base_course |          0 | PRIMARY   |            1 | course_id   | A         |          17 |     NULL | NULL   |      | BTREE      |         |               |
| sc_base_course |          1 | agency_id |            1 | agency_id   | A         |          17 |     NULL | NULL   |      | BTREE      |         |               |
| sc_base_course |          1 | agency_id |            2 | course_name | A         |          17 |     NULL | NULL   |      | BTREE      |         |               |
+----------------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

获取第一页10行;

select course_id,grade_id from sc_base_course where  agency_id = 10000  limit 0,10;
+-----------+----------+
| course_id | grade_id |
+-----------+----------+
|        13 |        1 |
|         6 |        3 |
|        12 |        4 |
|         8 |        2 |
|         7 |        2 |
|         9 |        4 |
|        16 |        1 |
|         1 |        2 |
|        17 |        1 |
|        14 |        5 |
+-----------+----------+

得到第二页7行

select course_id,grade_id from sc_base_course where  agency_id = 10000  limit 10,10;
+-----------+----------+
| course_id | grade_id |
+-----------+----------+
|        11 |        4 |
|        12 |        4 |
|        13 |        1 |
|        14 |        5 |
|        15 |        1 |
|        16 |        1 |
|        17 |        1 |
+-----------+----------+

使用order by!

SQL 表表示无序的行集。如果没有 order by 子句,数据库可以自由地 return 以任意顺序排列行,并且连续执行同一查询的结果可能不一致(因此,分页不稳定)。

select course_id, grade_id 
from sc_base_course 
where  agency_id = 10000  
order by course_id, grade_id
limit 10,10;

注意不仅需要order by子句,而且这个子句必须是确定性的。也就是说,子句中的列(或列集)必须唯一标识每条记录 - 否则,它再次未定义获取领带的顺序。