Les index uniques sont évalués par ligne et non par instruction (ce qui est par exemple différent de l'implémentation d'Oracle)
La solution à ce problème est d'utiliser une contrainte unique qui peut être différée et donc valorisée en fin de transaction.
Alors à la place de l'index unique, définissez une contrainte :
alter table test add constraint test_idx_pos unique (pos)
deferrable initially deferred;