2012-11-07 28 views
10

Tôi đã đánh giá chức năng hstore của PostgreSQL (9.2) và điều duy nhất mà fine manual không rõ ràng là cách đổi tên khóa. Ví dụ: làm cách nào tôi có thể đổi tên khóa c thành ai_count?Đổi tên khóa hstore trong PostgreSQL 9.2

"c"=>"3", "ai_voltage"=>"3", "ai_temperature"=>"28"

Tôi đang nghĩ không có cách nào trực tiếp để làm điều này và rằng nó liên quan đến sao chép chìa khóa c cho một phím ai_count, sau đó thả phím c. Làm thế nào tôi có thể làm điều này, lý tưởng như một lớp lót có thể được áp dụng cho nhiều bản ghi?

Trả lời

12

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" 
+0

đẹp, cảm ơn bạn. – Jeff

+0

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

+1

@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 đỡ. –

Các vấn đề liên quan