Je pense que le problème ici est que le hstore que vous avez est nul, et null OU un hstore est nul.
La meilleure solution que j'ai, qui n'est probablement pas la meilleure solution, est de créer la table avec un hstore vide par défaut plutôt que d'autoriser null. Ensuite, vos exemples fonctionnent comme vous le souhaitez :
postgres=# create table htest (t text, h hstore default hstore(array[]::varchar[]));
CREATE TABLE
postgres=# insert into htest (t) values ('key');
INSERT 0 1
postgres=# update htest set h = h || ('foo'=>'bar') where t='key';
UPDATE 1
postgres=# select * from htest;
t | h
-----+--------------
key | "foo"=>"bar"
(1 row)
Je ne vois malheureusement pas de moyen plus propre de créer un hstore vide que hstore(array[]::varchar[])
mais cela ne veut pas dire qu'il n'y a pas de meilleur moyen. Vous pourriez incorporer ceci dans votre mise à jour hstore d'avant comme ceci :
update htest set h = coalesce(h, hstore(array[]::varchar[])) || ('foo'=>'bar') where t='key';
De cette façon, vous n'avez pas besoin de recréer la table. Je trouve ça assez grossier quand même. J'espère que cela vous aidera.