&gt; 2. A PGPSQL function that attempts to INSERT, catches the duplicate key exception and instead UPDATEs (also handling the case that the row vanishes), which is slower than hell<p>That&#x27;s not true, at least not when you&#x27;re operating on a single row at a time.  According to my benchmarks the function approach was usually within 10% of the native upsert -- even outperforming it by around 5% depending on data distribution.  For insert-or-select (instead of update) the function consistently outperformed INSERT ... IGNORE.