我在PostgreSQL文档中看到,如果没有order语句,SELECT将以未指定的顺序返回记录。
最近在一次采访中,我被问到如何按照插入记录的顺序选择记录,而不需要PK或created_at或其他可用于订购的字段。采访我的高级开发人员坚持认为,如果没有订单声明,这些记录将按照插入的顺序返回。
对PostgreSQL来说是这样吗?对MySQL来说是真的吗?或者其他关系数据库管理系统?
发布于 2020-03-07 21:17:31
我可以为MySQL负责。我不知道PostgreSQL的情况。
通常,默认顺序不是插入顺序。
对于InnoDB,默认顺序取决于为查询读取的索引的顺序。你可以从解释计划中得到这个信息。
对于MyISAM,它按照从表读取订单的顺序返回订单。这可能是插入的顺序,但MyISAM将在删除记录后重用空白,因此较新的行可能会提前存储。
所有这些都没有得到保证;这只是当前实现的一个副作用。MySQL可以在下一个版本中更改实现,使结果集的默认顺序不同,而不会违反任何文档化的行为。
因此,如果您需要一个特定的顺序的结果,您应该在您的查询中使用ORDER BY。
发布于 2020-03-07 21:23:23
按照BK的回答,举个例子..。
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?
+----+发布于 2021-09-21 06:18:37
就PostgreSQL而言,这是完全错误的。
如果没有删除或更新,行将按插入顺序存储在表中。尽管顺序扫描通常会按该顺序返回行,但这并不一定: PostgreSQL的同步顺序扫描功能可以在已经执行的行上进行顺序扫描“猪背”,以便从表的中部开始读取行。
但是,如果您更新或删除单个行,则行的排序将完全崩溃:行的旧版本将变得过时,并且(在UPDATE的情况下)新版本可能会在表中的某个完全不同的地方结束。旧行版本的空间最终由自动真空回收,并可用于新插入的行。
https://stackoverflow.com/questions/60582206
复制相似问题