Tôi nghĩ bạn nói đúng đó bạn phải kéo cặp cũ ra và đặt cặp mới (với phím đổi tên) trở lại trong
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)
nơi 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. Điều đó sẽ trả lại một hstore mới với thay đổi mong muốn nhưng nó giả định rằng from_key
là trong h
; nếu from_key
không nằm trong số h
thì bạn sẽ kết thúc bằng số to_key -> NULL
trong hstore của mình. Nếu bạn, giống như tất cả mọi người sane, không muốn NULL đi lạc sau đó tôi muốn bọc logic trong một chức năng đơn giản để làm cho nó dễ dàng hơn để thêm một 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ả những điều này và có đượ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"
Nguồn
2012-11-07 19:13:04
đẹp, cảm ơn bạn. – Jeff
Có cách nào để thực hiện nhanh chóng cho ~ 1 triệu bản ghi với cột hstore khi đổi tên nhiều khóa cùng lúc không? Tôi đang trên 9.3. – szimek
@szimek: AFAIK bạn phải mở từng cửa hàng, sửa nó và đặt lại (tức là cách cứng như trên). Bạn có thể thử hỏi một câu hỏi khác để một số chuyên gia PostgreSQL thực sự có thể giúp đỡ. –