В соответствии с документацией postgres вы добавляете ключ в столбец hstore следующим образом:
UPDATE tab SET h = h || ('c' => '3');
Но, похоже, это работает только в том случае, если поле hstore не пустое. Например:
postgres=# create table htest (t text, h hstore);
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 |
(1 row)
Обновление прошло успешно, но hstore не обновлялся. Однако:
postgres=# update htest set h = ('foo'=>'bar') where t='key';
UPDATE 1
postgres=# select * from htest;
t | h
-----+--------------
key | "foo"=>"bar"
(1 row)
postgres=# update htest set h = h || ('bar'=>'foo') where t='key';
UPDATE 1
postgres=# select * from htest;
t | h
-----+----------------------------
key | "bar"=>"foo", "foo"=>"bar"
(1 row)
Есть ли способ атомно добавить ключ в hstore без предварительной проверки, нет ли hstore?