Мисля, че проблемът тук е, че hstore, който имате, е null и null ИЛИ някой hstore е null.
Най-доброто решение, което имам, което вероятно не е най-доброто решение, е да направя таблицата с празен hstore по подразбиране, вместо да позволявам null. След това вашите примери работят както искате:
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)
За съжаление не виждам по-чист начин за създаване на празен hstore от hstore(array[]::varchar[])
но това не означава, че няма по-добър начин. Можете да включите това във вашата актуализация на hstore от преди, така:
update htest set h = coalesce(h, hstore(array[]::varchar[])) || ('foo'=>'bar') where t='key';
По този начин не е необходимо да пресъздавате таблицата. Все пак намирам това за доста грубо. Надявам се това да помогне.