Saya pikir masalahnya di sini adalah bahwa hstore yang Anda miliki adalah null, dan null ATAU beberapa hstore adalah null.
Solusi terbaik yang saya miliki, yang mungkin bukan solusi terbaik, adalah membuat tabel dengan hstore kosong default daripada membiarkan nol. Kemudian contoh Anda berfungsi seperti yang Anda inginkan:
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)
Sayangnya saya tidak melihat cara yang lebih bersih untuk membuat hstore kosong daripada hstore(array[]::varchar[])
tapi itu tidak berarti tidak ada cara yang lebih baik. Anda dapat memasukkan ini ke dalam pembaruan hstore Anda dari sebelumnya seperti:
update htest set h = coalesce(h, hstore(array[]::varchar[])) || ('foo'=>'bar') where t='key';
Dengan cara ini Anda tidak perlu membuat ulang tabel. Saya menemukan bahwa cukup kotor sekalipun. Semoga membantu.