在PostgreSQL 9.2中重命名hstore密钥

在PostgreSQL 9.2中重命名hstore密钥,postgresql,hstore,Postgresql,Hstore,我一直在评估PostgreSQL的hstore功能(9.2),唯一没有明确说明的是如何重命名键。例如,如何将键c重命名为ai_count “c”=>“3”、“ai_电压”=>“3”、“ai_温度”=>“28” 我认为没有直接的方法可以做到这一点,它需要将c键复制到ai\u count键,然后删除c键。理想情况下,作为一个可以应用于多个记录的一行程序,我如何才能做到这一点呢?我认为你是对的,你必须将旧的一对取出,然后将新的一对(使用重命名的密钥)放回 你可以用一个班轮: (h - from_key

我一直在评估PostgreSQL的hstore功能(9.2),唯一没有明确说明的是如何重命名键。例如,如何将键
c
重命名为
ai_count

“c”=>“3”、“ai_电压”=>“3”、“ai_温度”=>“28”


我认为没有直接的方法可以做到这一点,它需要将
c
键复制到
ai\u count
键,然后删除
c
键。理想情况下,作为一个可以应用于多个记录的一行程序,我如何才能做到这一点呢?

我认为你是对的,你必须将旧的一对取出,然后将新的一对(使用重命名的密钥)放回

你可以用一个班轮:

(h - from_key) || hstore(to_key, h -> from_key)
其中
h
是hstore,
from_key
是要更改的键,
to_key
是要更改的键。这将返回带有所需更改的新存储,但它假定
from_key
位于
h
;如果
from_key
不在
h
中,那么您的hstore中将会出现
to_key->NULL
。如果你,像所有理智的人一样,不希望出现零值,那么我会将逻辑封装在一个简单的函数中,以便于添加存在性检查;大概是这样的:

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;
然后您可以同时说出这两个选项并获得预期结果:

=> 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"

当一次重命名多个键时,是否有任何方法可以使用hstore列快速处理约100万条记录?我在9.3上。@szimek:AFAIK你必须打开每个商店,把它修好,然后把它放回去(也就是说,如上所述的艰难之路)。您可以尝试问另一个问题,以便一些真正的PostgreSQL专家能够提供帮助。为了避免添加空值,您可能希望筛选使用
WHERE h更新的记录?从_键开始