Misalnya ketika saya menggunakan kueri yang mengembalikan id rekaman
INSERT INTO projects(name)
VALUES (name1), (name2), (name3) returning id;
Yang menghasilkan output:
1
2
3
Apakah id ini akan menunjukkan nilai yang dimasukkan yang sesuai?
1 -> name1
2 -> name2
3 -> name3
postgresql
insert
order-by
postgresql-9.4
Sergey
sumber
sumber
Jawaban:
Jawaban untuk kasus sederhana ini adalah Ya . Baris dimasukkan dalam urutan yang disediakan dalam
VALUES
ekspresi. Dan jikaid
kolom Anda adalahserial
tipe, nilai dari urutan yang mendasarinya akan diambil dalam urutan itu.Tetapi ini adalah detail implementasi dan tidak ada jaminan. Secara khusus, pesanan tidak harus dipertahankan dalam permintaan yang lebih kompleks dengan
WHERE
kondisi atau gabungan.Anda juga bisa mendapatkan celah atau baris lain jika Anda memiliki transaksi bersamaan menulis ke meja yang sama pada saat yang sama. Tidak mungkin, tetapi mungkin.
Tidak ada urutan "alami" dalam tabel database. Sementara urutan fisik baris (yang tercermin dalam kolom sistem
ctid
) akan sesuai dengan urutan yang dimasukkan pada awalnya, yang dapat berubah sewaktu-waktu.UPDATE
,DELETE
,VACUUM
Dan perintah lainnya dapat mengubah urutan fisik baris. Tetapi nilai yang dihasilkan untukid
stabil dan tidak terhubung dengan cara apa pun, tentu saja.sumber
serial
kolom yang baru dibuat - idealnya dalam transaksi yang sama.WHERE
kondisi. Sementara saya tidak bisa memikirkanWHERE
kondisi sederhana yang akan mengubah urutan baris, bergabung tentu bisa melakukan itu.Jawaban Erwin Brandstetter mungkin tidak benar dalam kasus tertentu.
Kami telah melakukan
INSERT INTO ... SELECT bar,baz FROM foo ORDER BY bar
dan kami melihat bahwaSELECT ctid,* FROM foo
menunjukkan bahwa pemesanan fisik dari baris dalam tabel tidak persis sama dengan urutan sisipan, tampaknya sedikit acak-acakan. Perhatikan bahwa tabel kami memiliki kolom jsonb dengan ukuran data yang sangat bervariasi. Memotong data jsonb secara eksperimental selama penyisipan menyebabkan urutan penyisipan menjadi benar.sumber