Answers:
这个简单案例的答案是肯定的。在VALUES
表达式中按提供的顺序插入行。而且,如果您的id
列是serial
类型,则将按该顺序从基础序列中获取值。
但这是一个实现细节,不能保证。特别是,在具有WHERE
条件或联接的更复杂的查询中不一定要保留顺序。
如果同时进行的事务同时写入同一张表,则可能还会混入间隙或其他行。不太可能,但可能。
数据库表中没有“自然”顺序。尽管行的物理顺序(反映在系统列中ctid
)最初将与它们的插入顺序相对应,但随时可能会改变。UPDATE
,DELETE
,VACUUM
和其他命令可以改变行的物理顺序。但是,生成的值id
是稳定的,并且与它毫无关系。
serial
列就是这种情况-理想情况下是在同一事务中。
WHERE
条件的更复杂的查询。尽管我无法想到WHERE
会改变行顺序的简单条件,但联接当然可以做到这一点。
在某些情况下,Erwin Brandstetter的回答可能不正确。
我们已经完成了一项操作,INSERT INTO ... SELECT bar,baz FROM foo ORDER BY bar
并且看到
SELECT ctid,* FROM foo
显示表中行的物理顺序与插入顺序不完全匹配的情况,似乎有点儿混乱了。请注意,我们的表有一个jsonb列,其数据大小高度可变。在插入期间实验性地截断jsonb数据会导致插入顺序正确。