Tôi nghĩ rằng bạn đúng khi bạn phải kéo cặp cũ ra và đặt lại cặp mới (với khóa đã được đổi tên) vào lại.
Bạn có thể làm điều đó với một lớp lót:
(h - from_key) || hstore(to_key, h -> from_key)
ở đâu h
là hstore, from_key
là khóa bạn muốn thay đổi và to_key
là những gì bạn muốn thay đổi nó thành. Điều đó sẽ trả về một hstore mới với thay đổi mong muốn nhưng nó giả định rằng from_key
ở h
; if from_key
không có trong h
thì bạn sẽ kết thúc bằng to_key -> NULL
trong cửa hàng của bạn. Nếu bạn, giống như tất cả những người lành mạnh, không muốn NULL đi lạc thì tôi sẽ gói logic trong một hàm đơn giản để dễ dàng thêm kiểm tra sự tồn tại; một cái gì đó như thế này:
create or replace function
change_hstore_key(h hstore, from_key text, to_key text) returns hstore as $$
begin
if h ? from_key then
return (h - from_key) || hstore(to_key, h -> from_key);
end if;
return h;
end
$$ language plpgsql;
Sau đó, bạn có thể nói cả hai điều này và nhận được kết quả mong đợi:
=> select change_hstore_key('a=>1,b=>2,c=>3'::hstore, 'b', 'pancakes');
change_hstore_key
------------------------------
"pancakes"=>"2", "a"=>"1", "c"=>"3"
=> select change_hstore_key('a=>1,b=>2,c=>3'::hstore, 'pancakes', 'X');
change_hstore_key
------------------------------
"a"=>"1", "b"=>"2", "c"=>"3"