[英]Postgres INSERT INTO with SELECT ordering
通过select
语句插入Postgres时,是否保证按照select语句返回的顺序插入行?
也就是说,给定一个表格bar
(其中id
是SERIAL PRIMARY KEY
, name
是TEXT
):
id | name
---+-----
0 | A
1 | B
2 | C
而另一张表, foo
(空,并用相同的架构),如果我INSERT INTO foo (name) SELECT name FROM bar ORDER BY id DESC
将foo
保证有:
id | name
---+-----
0 | C
1 | B
2 | A
这似乎是这种情况,但我想确认它不是一个实现细节,可能不适用更大的选择。
我阅读了SQL-92标准中的第13.8节和一般规则#3声称“在将任何行插入B之前对查询表达式进行了有效评估”,但它没有明确说明任何有关排序的内容。 标准是否有目的地模糊(也许允许并行插入?)和排序是一个实现细节?
我在Postgres邮件列表上询问过,他们在澄清方面很有帮助。 事实证明这是一个特定于数据库的答案,所以如果您正在阅读本文并使用不同的数据库,答案可能会不一样。
Postgres,显式为9.6,将按返回结果集的顺序逻辑插入。
该行为明确编入此提交: https : //github.com/postgres/postgres/commit/9118d03a8cca3d97327c56bf89a72e328e454e63
从提交说明:
例如,在SELECT x中,nextval('seq')FROM选项卡ORDER BY x LIMIT 10; 可能希望nextval()的值与x相同,而nextval()的运行次数不超过10次。
在过去,Postgres在这方面不一致:如果通过索引扫描执行排序,您将获得理想的行为,但如果必须通过显式排序步骤执行则不会。
TL;博士; 插入顺序是一个实现细节,但在Postgres 9.6及更高版本中有目的地编码以匹配一个人的直觉。 在9.6之前,没有任何保证。
新表中的行将按ORDER BY
子句指定的顺序插入,因此从序列生成的id
将反映此顺序。
要验证这一点,请查看执行计划,您应该能够在Insert
之前看到Sort
节点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.