2011-03-25 120 views

回答

15

我没有在the documentation中看到任何保证RETURNING的订单,所以我不认为你可以依赖它。赔率是RETURNING订单将与VALUES订单匹配,但我看不到任何有关VALUES将被插入的订单的任何保证; VALUES几乎肯定会按从左到右的顺序插入,但是再次没有文件保证。

此外,关系模型的设置基于排序是由用户应用的东西,而不是关系的固有属性。一般来说,如果无法明确指定排序,则不存在隐含顺序。

执行摘要:您看到的顺序可能总会发生,但不能保证,因此不要依赖它。

+1

我知道关系是无序的,但我不确定是否将'values'部分建模为关系或列表:)我希望这可能是一个特例,因为(order- ('t'),('b'),('c')返回(txt,id)'看起来有些浪费(猜测我正在过早地再次优化......) – FunctorSalad 2011-03-27 17:26:15

+0

@FunctorSalad:'values'可能被视为一个列表,但我不认为它在任何地方都有保证。如果处理来自“回归”的命令是你的表现瓶颈,那么你可能会做得很好:) – 2011-03-27 20:28:10

+1

同意,*绝对*不要依赖它。 PostgreSQL完全有权对输入进行排序,但是会产生最佳的插入性能,并且如果实现了索引组织表,它可能会实现。 – 2014-02-01 12:35:38

3

虽然这不会帮助你现在,9.1将包括"writeable common table expressions"。这是WITH syntax的官方名称。 (Wikipedia

这个新功能应该让你把你的INSERT ... RETURNING一个WITH内,给一个别名,然后SELECT针对与一个普通的老ORDER BY子句的具体顺序。

+2

这很有趣,但只与切线有关。它可以用作OP所要求的近似值*仅当INPUT顺序可以用明确的和等效的ORDER BY来表示时。 – Flimzy 2013-06-22 18:23:40

7

虽然文档并不完全清楚,但它确实状态:

如果INSERT命令包含RETURNING子句,则结果将类似于含有列和值SELECT语句定义的在RETURNING列表中,通过命令插入的行计算。

现在“类似”是不是铁定的保证,我已经raised this for discussion on the mailing list ...但在实践中,PostgreSQL将不惹值的RETURNING顺序。即使我们想要进行优化,我们也不可能做到这一点,因为太多的应用程序依靠它被命令与输入相同。

因此...对于INSERT INTO ... VALUES (...), (...), ... RETURNING ...INSERT INTO ... SELECT ... ORDER BY ... RETURNING ...假设结果关系与输入顺序相同应该是安全的。

相关问题