回答:
この単純なケースの答えはYesです。行は、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データを実験的に切り捨てると、挿入順序が正しくなりました。