Postgres kayıt ekleme sırasını koruyor mu?


19

Örneğin, kayıt kimliklerini döndüren bir sorgu kullandığımda

INSERT INTO projects(name)
VALUES (name1), (name2), (name3) returning id;

Hangi çıktı üretmek:

1
2
3

Bu kimlikler karşılık gelen girilen değerlere işaret edecek mi?

1 -> name1
2 -> name2
3 -> name3

4
Asıl cevap bir yana (ki hayır olduğuna inanıyorum), sorgularınızda belirttiğinizden başka bir siparişe güvenmemelisiniz.
dezso

Yanıtlar:


17

Bu basit durumun cevabı Evet . Satırlar, VALUESifadede sağlanan sırayla eklenir . Senin eğer idsütun olan serialtip, altta yatan dizisinden değerleri sırayla getirilen olacaktır.

Ancak bu bir uygulama detayıdır ve garanti yoktur. Özellikle, siparişin WHEREşartlar veya birleşimlerle daha karmaşık sorgularda tutulması gerekmez .

Aynı anda aynı tabloya eşzamanlı işlemler yazıyorsanız, boşluklar veya diğer satırlar da karışabilir. Olası değil, ama mümkün.

Bir veritabanı tablosunda "doğal" düzen yoktur. Satırların fiziksel sırası ( sistem sütununactid yansıtılır ) başlangıçta eklenen sıralarına karşılık gelse de, bu her zaman değişebilir. UPDATE, DELETE, VACUUMVe diğer komutlar satırların fiziksel sırasını değiştirebilirsiniz. Ancak için üretilen değerler idsabittir ve elbette buna hiçbir şekilde bağlı değildir.


Bence Sergey daha ilk satır her zaman id = 1 olsun, ikinci id = 2 ve üçüncü id = 3 - gerçek "sipariş" ya da satırlar
8_a_horse_with_no_name

@a_horse_with_no_name: Bunu cevaplamak için : serialideal olarak aynı işlemde yeni oluşturulmuş bir sütun için geçerli olacak .
Erwin Brandstetter

Eğer soru "isim3'ün kimliği her zaman isim1'inkinden daha büyük olacak" ise, o zaman her zaman doğru olur mu? (2. paragrafınız ile ilgili olarak)
lulalala

@lulalala: Birleşimler ve WHEREkoşullarla daha karmaşık sorgular için gerekli değildir . WHERESatırların sırasını değiştirecek basit koşulları düşünemesem de , birleşimler kesinlikle bunu yapabilir.
Erwin Brandstetter

3

Erwin Brandstetter'in cevabı belirli bir durumda doğru olmayabilir.

Biz yaptık INSERT INTO ... SELECT bar,baz FROM foo ORDER BY bar ve biz görüyoruz SELECT ctid,* FROM foo tablodaki satırların fiziksel sipariş tam insert sırasını uyuşmadığını gösterir, bu biraz yukarı şifreli görünüyor. Tablonuzun çok değişken veri boyutuna sahip bir jsonb sütunu olduğunu unutmayın. Kesici uç sırasında jsonb verilerinin deneysel olarak kesilmesi kesici uç sırasının doğru olmasına neden oldu.


3
As @Erwin işaret yılında ilk cümle , sadece "evet" sorusuna atıfta o belirli tek örneğinde söylüyor. @Deszo'nun yorumunda söylediği gibi , asla "insert" siparişine güvenmeyin; herhangi bir amaçla bu siparişe güveniyorsanız, siparişi daima select deyiminde belirtmelisiniz.
Max Vernon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.