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