Na przykład, gdy używam zapytania, które zwraca identyfikatory rekordów
INSERT INTO projects(name)
VALUES (name1), (name2), (name3) returning id;
Które produkują wydajność:
1
2
3
Czy te identyfikatory wskazują odpowiednie wstawione wartości?
1 -> name1
2 -> name2
3 -> name3
postgresql
insert
order-by
postgresql-9.4
Siergiej
źródło
źródło
Odpowiedzi:
Odpowiedź na ten prosty przypadek brzmi: tak . Wiersze są wstawiane w podanej kolejności w
VALUES
wyrażeniu. A jeśli twojaid
kolumna jestserial
typem, wartości z sekwencji będą pobierane w tej kolejności.Jest to jednak szczegół implementacji i nie ma żadnych gwarancji. W szczególności kolejność niekoniecznie jest utrzymywana w bardziej złożonych zapytaniach z
WHERE
warunkami lub złączeniami.Możesz również mieszać luki lub inne wiersze, jeśli masz jednocześnie transakcje zapisujące do tej samej tabeli. Mało prawdopodobne, ale możliwe.
W tabeli bazy danych nie ma „naturalnego” porządku. Chociaż fizyczna kolejność wierszy (która jest odzwierciedlona w kolumnie systemowej
ctid
) będzie początkowo odpowiadać ich wstawionej kolejności, która może ulec zmianie w dowolnym momencie.UPDATE
,DELETE
,VACUUM
I innych poleceń można zmienić fizyczną kolejność wierszy. Ale generowane wartości dlaid
są stabilne i oczywiście w żaden sposób z tym nie związane.źródło
serial
kolumny - najlepiej w tej samej transakcji.WHERE
warunkami. Chociaż nie mogę wymyślić prostychWHERE
warunków, które zmieniłyby kolejność wierszy, sprzężenia z pewnością mogą to zrobić.Odpowiedź Erwina Brandstettera może w niektórych przypadkach być nieprawidłowa.
Zrobiliśmy
INSERT INTO ... SELECT bar,baz FROM foo ORDER BY bar
i widzimy, żeSELECT ctid,* FROM foo
pokazuje, że fizyczna kolejność wierszy w tabeli nie pasuje dokładnie do kolejności wstawiania, wydaje się, że nieco się zakodowała. Zauważ, że nasza tabela ma kolumnę jsonb o bardzo zmiennej wielkości danych. Eksperymentalne obcięcie danych jsonb podczas wstawiania spowodowało, że kolejność wstawiania była prawidłowa.źródło