Tôi nghĩ vấn đề ở đây là hstore bạn có là null và null HOẶC một số hstore là null.
Giải pháp tốt nhất mà tôi có, có lẽ không phải là giải pháp tốt nhất, là tạo bảng với một hstore trống mặc định thay vì cho phép null. Sau đó, các ví dụ của bạn hoạt động như bạn muốn:
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)
Rất tiếc, tôi không thấy cách nào rõ ràng hơn để tạo một hstore trống hơn là hstore(array[]::varchar[])
nhưng điều đó không có nghĩa là không có cách nào tốt hơn. Bạn có thể kết hợp điều này vào bản cập nhật hstore của mình từ trước như vậy:
update htest set h = coalesce(h, hstore(array[]::varchar[])) || ('foo'=>'bar') where t='key';
Bằng cách này, bạn không cần tạo lại bảng. Tôi thấy điều đó khá thô thiển. Hy vọng điều này sẽ hữu ích.