Je pense que vous avez raison de retirer l'ancienne paire et de remettre la nouvelle paire (avec la clé renommée).
Vous pourriez le faire avec un one-liner :
(h - from_key) || hstore(to_key, h -> from_key)
où h
est le hstore, from_key
est la clé que vous souhaitez modifier et to_key
est ce que vous voulez changer. Cela renverra un nouveau hstore avec le changement souhaité mais cela suppose que from_key
est en h
; si from_key
n'est pas dans h
alors vous vous retrouverez avec un to_key -> NULL
dans votre hstore. Si vous, comme toutes les personnes saines d'esprit, ne voulez pas le NULL parasite, j'envelopperais la logique dans une fonction simple pour faciliter l'ajout d'une vérification d'existence; quelque chose comme ça :
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;
Ensuite, vous pouvez dire les deux et obtenir les résultats attendus :
=> 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"