Czytałem o różnych UPSERT
implementacjach w PostgreSQL, ale wszystkie te rozwiązania są stosunkowo stare lub względnie egzotyczne ( na przykład przy użyciu zapisywalnego CTE ).
I po prostu wcale nie jestem ekspertem od psql, aby dowiedzieć się od razu, czy te rozwiązania są stare, ponieważ są dobrze zalecane, czy też są (cóż, prawie wszystkie z nich) tylko zabawkowymi przykładami nieodpowiednimi do użytku produkcyjnego.
Jaki jest najbardziej bezpieczny dla wątków sposób wdrożenia UPSERT w PostgreSQL?
postgresql
plpgsql
upsert
shabunc
źródło
źródło
AKTUALIZACJA (2015-08-20):
Istnieje teraz oficjalna implementacja obsługi wstawek za pomocą
ON CONFLICT DO UPDATE
(oficjalnej dokumentacji). W chwili pisania tego tekstu ta funkcja znajduje się obecnie w PostgreSQL 9.5 Alpha 2, który można pobrać tutaj: katalogi źródłowe Postgres .Oto przykład, zakładając, że
item_id
jest to Twój klucz podstawowy:Oryginalny post ...
Oto implementacja, do której doszedłem, chcąc uzyskać wgląd w to, czy wstawka lub aktualizacja miała miejsce.
Definicja
upsert_data
polega na konsolidacji wartości w jednym zasobie zamiast konieczności dwukrotnego podawania ceny i item_id: raz dla aktualizacji, ponownie dla wkładki.Jeśli nie podoba ci się użycie
upsert_data
, oto alternatywna implementacja:źródło
Dzięki temu dowiesz się, czy wstawienie lub aktualizacja nastąpiła:
Jeśli nastąpi aktualizacja, otrzymasz wstawkę 0, w przeciwnym razie wstaw 1 lub błąd.
źródło