Niezapisywalny CTE zostały uznane za rozwiązanie upsert przed do 9,5 tak jak opisano w Insert, on duplicate update in PostgreSQL?Jak sprawdzić, czy uaktualnienie było aktualizacją z PostgreSQL 9.5+ UPSERT?
Jest to możliwe do przeprowadzenia upsert z informacją, czy zakończył się jako aktualizację albo wkładka z następującym zapisujące CTE idiomu:
WITH
update_cte AS (
UPDATE t SET v = $1 WHERE id = $2 RETURNING 'updated'::text status
),
insert_cte AS (
INSERT INTO t(id, v) SELECT $2, $1 WHERE NOT EXISTS
(SELECT 1 FROM update_cte) RETURNING 'inserted'::text status
)
(SELECT status FROM update_cte) UNION (SELECT status FROM insert_cte)
To zapytanie zwróci albo „zaktualizowane” lub „wstawiony”, albo może (rzadko) nie z naruszenia ograniczenia w sposób opisany w https://dba.stackexchange.com/questions/78510/why-is-cte-open-to-lost-updates
czy coś podobnego można osiągnąć przy użyciu PostgreSQL 9.5+ nowego „upsert” składnia, benefi z jego optymalizacji i uniknięcia możliwego naruszenia ograniczeń?
Dobra sztuczka **** – lad2025
O mój Boże, to brzydkie! To powoduje, że moja wizja się zaciera. Zdecydowanie nie chcę tego pamiętać, nie mówiąc już o zastosowaniu! ~ – Patrick
możesz to zrobić za pomocą 'xmax :: text :: int> 0' - bez ustawienia poziomu transakcji (co jest rzeczywiście oryginalnym hackiem) –