sql - 带有 SELECT 排序的 Postgres INSERT INTO
问题描述
通过语句插入 Postgres 时select
,是否保证以与 select 语句返回它们的顺序相同的顺序插入行?
也就是说,给定一个表bar
(其中id
isSERIAL PRIMARY KEY
和name
is 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 标准和一般规则 #3 中的第 13.8 节,声称“在将任何行插入 B 之前有效地评估了查询表达式”,但它没有明确说明任何关于排序的内容。标准是否故意含糊不清(也许允许并行插入?)并且排序是实现细节?
解决方案
我在 Postgres 邮件列表上询问过,他们有助于澄清。事实证明,这是一个特定于数据库的答案,因此如果您正在阅读此内容并使用不同的数据库,答案可能不一样。
从 9.6 开始,Postgres 将在逻辑上按照返回的结果集的顺序插入。
该行为在此提交中明确编码:https ://github.com/postgres/postgres/commit/9118d03a8cca3d97327c56bf89a72e328e454e63
从提交描述:
例如,在 SELECT x 中,nextval('seq') FROM tab ORDER BY x LIMIT 10; 可能希望 nextval() 值的排序与 x 相同,并且 nextval() 运行次数不超过 10 次。
过去,Postgres 在这方面是不一致的:如果排序是通过 indexscan 执行的,您将获得理想的行为,但如果必须通过显式排序步骤完成,则不会。
tl;博士; 插入顺序是一个实现细节,但在 Postgres 9.6 及更高版本中有意编码以符合直觉。在 9.6 之前,没有任何保证。
推荐阅读
- django - 如何验证登录
- javascript - React Error : 已声明但它的值从未被读取。[6133]
- highcharts - 如何在高角图表包装器中使用添加系列和更新方法?
- python - 我如何访问kivy中的全局变量
- chart.js - Chartjs条形图试图从数据集中获取标签
- javascript - 在Javascript引擎(v8)中,优化阶段的“隐式调用”到底是什么意思?
- jquery - c3条形图标签颜色
- reactjs - React Fusion Charts - 注释标签样式不起作用
- html - 在仪表板标题中间对齐具有可变长度的文本
- openebs - 从集群中删除一个工作节点后,OpenEBS 目标 pod 无法与其副本通信