为何PostgreSQL更新行后SELECT查询返回无序数据?
PostgreSQL查询默认排序的误区解释
这是个非常容易踩的坑——PostgreSQL(以及所有遵循SQL标准的关系型数据库)从来不会给未指定ORDER BY子句的查询承诺任何固定的返回顺序。
为什么更新前看起来是按id排序?
你更新前的查询结果按id升序排列,只是一个巧合:当你按id1到7的顺序插入数据时,这些行大概率被连续存储在数据库的物理数据页中,PostgreSQL扫描数据时会按存储顺序返回,刚好和你的id顺序一致。但这只是存储层面的偶然结果,不是数据库的规则。
为什么更新后顺序变了?
当你执行UPDATE check_user set name = 'c1' where name = 'c1\';这个操作时,数据库需要修改id=5的那一行数据。如果修改后的行大小和原来不同(或者数据库当前的存储页没有足够空间容纳修改后的行),PostgreSQL会把这行数据移到新的存储位置(比如表的末尾空闲空间)。当你再次查询时,数据库扫描数据的顺序就会包含这个新位置的行,所以它出现在了结果的最后。
如何保证固定的排序顺序?
如果需要查询结果始终按特定顺序返回,必须显式添加ORDER BY子句。比如你想要按id升序排列,就写:
SELECT * FROM check_user ORDER BY id;
这样不管数据的物理存储位置怎么变化,返回结果都会严格按照id的顺序排列。
内容的提问来源于stack exchange,提问作者Mangu Singh Rajpurohit
相关产品推荐
相关产品推荐

