首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PostgreSQL或MySQL中的默认选择顺序是什么?

问PostgreSQL或MySQL中的默认选择顺序是什么?
EN

Stack Overflow用户
提问于 2020-03-07 21:07:33
回答 4查看 2K关注 0票数 2

我在PostgreSQL文档中看到,如果没有order语句,SELECT将以未指定的顺序返回记录。

最近在一次采访中,我被问到如何按照插入记录的顺序选择记录,而不需要PK或created_at或其他可用于订购的字段。采访我的高级开发人员坚持认为,如果没有订单声明,这些记录将按照插入的顺序返回。

对PostgreSQL来说是这样吗?对MySQL来说是真的吗?或者其他关系数据库管理系统?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-03-07 21:17:31

我可以为MySQL负责。我不知道PostgreSQL的情况。

通常,默认顺序不是插入顺序。

对于InnoDB,默认顺序取决于为查询读取的索引的顺序。你可以从解释计划中得到这个信息。

对于MyISAM,它按照从表读取订单的顺序返回订单。这可能是插入的顺序,但MyISAM将在删除记录后重用空白,因此较新的行可能会提前存储。

所有这些都没有得到保证;这只是当前实现的一个副作用。MySQL可以在下一个版本中更改实现,使结果集的默认顺序不同,而不会违反任何文档化的行为。

因此,如果您需要一个特定的顺序的结果,您应该在您的查询中使用ORDER BY。

票数 6
EN

Stack Overflow用户

发布于 2020-03-07 21:23:23

按照BK的回答,举个例子..。

代码语言:javascript
复制
DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table(id INT NOT NULL) ENGINE = MYISAM;

INSERT INTO my_table VALUES (1),(9),(5),(8),(7),(3),(2),(6);

DELETE FROM my_table WHERE id = 8;

INSERT INTO my_table VALUES (4),(8);

SELECT * FROM my_table;
+----+
| id |
+----+
|  1 |
|  9 |
|  5 |
|  4 | -- is this what
|  7 |
|  3 |
|  2 |
|  6 |
|  8 | -- we expect?
+----+
票数 3
EN

Stack Overflow用户

发布于 2021-09-21 06:18:37

就PostgreSQL而言,这是完全错误的。

如果没有删除或更新,行将按插入顺序存储在表中。尽管顺序扫描通常会按该顺序返回行,但这并不一定: PostgreSQL的同步顺序扫描功能可以在已经执行的行上进行顺序扫描“猪背”,以便从表的中部开始读取行。

但是,如果您更新或删除单个行,则行的排序将完全崩溃:行的旧版本将变得过时,并且(在UPDATE的情况下)新版本可能会在表中的某个完全不同的地方结束。旧行版本的空间最终由自动真空回收,并可用于新插入的行。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60582206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档