【发布时间】:2018-06-12 04:09:56
【问题描述】:
当通过select 语句插入 Postgres 时,是否保证插入的行与 select 语句返回的顺序相同?
也就是说,给定一个表bar(其中id 是SERIAL PRIMARY KEY,name 是TEXT):
id | name
---+-----
0 | A
1 | B
2 | C
如果我INSERT INTO foo (name) SELECT name FROM bar ORDER BY id DESC 将保证foo 有另一个表,foo(空且具有相同的架构):
id | name
---+-----
0 | C
1 | B
2 | A
似乎是这样,但我想确认它不是一个可能不适用于较大选择的实现细节。
我通读了SQL-92 standard 中的第 13.8 节,一般规则 #3 声称“在将任何行插入 B 之前有效地评估了查询表达式”,但它没有明确说明有关排序的任何内容。标准是否有意模糊(也许允许并行插入?)并且排序是实现细节?
【问题讨论】:
-
这个DBA Stack Exchange article 似乎拒绝了。您不应该依赖任何内部订单。
-
@marc_s 这里有一个 ORDER BY,只是一个问题 INSERT 是否按这个顺序处理结果
-
@marc_s 这不是无关紧要的。有一个用于创建 ID 的序列。这很大程度上是插入顺序和副作用的问题。不是查询时的结果。触发器也是如此,它们是否按照 SELECT 查询返回行的顺序运行。
-
这是一个有趣的问题。虽然 MySQL 在他们的文档中声明
ORDER BY确实很重要,而且对于 SQL Server 也有微软人员证实了这一点,但我在 Internet 上找不到任何关于 PostgreSQL(或 Oracle)的信息。我认为这应该在文档中明确说明。对于 PostgreSQL,postgresql.org/docs/current/static/sql-insert.html 中有一个链接可引导您进入一个表单,您应该可以在该表单中要求他们在其文档中的INSERT SELECT中包含对ORDER BY的解释。 -
插入不保证“模仿”选择的顺序。例如,与包含使用
delete删除的行的表相比,新创建的表中的“插入顺序”可能不同,而包含使用truncate和另一个删除的行的表的另一个“顺序”可能不同如果只删除了一半的行,则为“order”。对于SELECT语句,获得保证 订单的only(实际上:only)方法是使用order by。没有其他选择。
标签: sql postgresql