繁体   English   中英

Postgres使用SELECT命令INSERT INTO

[英]Postgres INSERT INTO with SELECT ordering

通过select语句插入Postgres时,是否保证按照select语句返回的顺序插入行?

也就是说,给定一个表格bar (其中idSERIAL PRIMARY KEYnameTEXT ):

id | name
---+-----
 0 | A
 1 | B
 2 | C

而另一张表, foo (空,并用相同的架构),如果我INSERT INTO foo (name) SELECT name FROM bar ORDER BY id DESCfoo保证有:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM