Jag tror att du har rätt i att du måste dra ut det gamla paret och sätta in det nya paret (med den omdöpta nyckeln) igen.
Du kan göra det med en one-liner:
(h - from_key) || hstore(to_key, h -> from_key)
där h
är hstore, from_key
är nyckeln du vill ändra och to_key
är vad du vill ändra det till. Det kommer att returnera en ny hstore med den önskade ändringen men det förutsätter att from_key
är i h
; om from_key
finns inte i h
då kommer du att få en to_key -> NULL
i din hstore. Om du, som alla sansade människor, inte vill ha den herrelösa NULL så skulle jag slå in logiken i en enkel funktion för att göra det lättare att lägga till en existenskontroll; något sånt här:
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;
Då kan du säga båda dessa och få de förväntade resultaten:
=> 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"