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
子句,而且这个子句必须是确定性的。也就是说,子句中的列(或列集)必须唯一标识每条记录 - 否则,它再次未定义获取领带的顺序。
我使用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
子句,而且这个子句必须是确定性的。也就是说,子句中的列(或列集)必须唯一标识每条记录 - 否则,它再次未定义获取领带的顺序。