penso che tu abbia ragione che si deve tirare il vecchio paio fuori e mettere la nuova coppia (con la chiave rinominato) indietro nel
si potrebbe fare con una battuta:.
(h - from_key) || hstore(to_key, h -> from_key)
dove h
è lo store, from_key
è la chiave che si desidera modificare e to_key
è ciò che si desidera modificare. Ciò restituirà un nuovo hstore con la modifica desiderata ma presuppone che from_key
sia in h
; se from_key
non è in h
, ti ritroverai con uno to_key -> NULL
nel tuo archivio. Se tu, come tutte le persone sane, non vuoi il randagio NULL, allora avvolgerei la logica in una semplice funzione per rendere più facile aggiungere un controllo dell'esistenza; qualcosa di simile:
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;
allora si può dire sia di questi e di ottenere i risultati attesi:
=> 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"
fonte
2012-11-07 19:13:04
bello, grazie. – Jeff
C'è un modo per farlo velocemente per ~ 1 milione di record con la colonna di hstore quando si rinomina più chiavi contemporaneamente? Sono al 9.3. – szimek
@szimek: AFAIK dovresti aprire ogni hstore, sistemarlo e rimetterlo (cioè nel modo più duro come sopra). Potresti provare a fare un'altra domanda in modo che alcuni dei veri esperti di PostgreSQL possano aiutarti. –