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