2013-02-20 67 views
-1

所有行表中的我有這樣的表:更新在二郎

-record(person, {id, firstname, lastname, address}). 

例如該表包含此值:

2 alen  dumas  paris 
5 franco mocci  parma 
3 ali  othmani london 

現在我有可變Key包含該值10

我想在erlang中開發一個函數,它將修改表person的所有id

這個id的新值將是前值+的Key

值意味着該表的人會變成這個樣子

12 alen  dumas  paris 
    15 franco mocci  parma 
    13 ali  othmani london 

這意味着每個id將由10被添加(是的的Key值):(2 + 10)(5 + 10)(3 + 10)

我嘗試與您的代碼:

testmodify()-> 
    Key=22, 
    [ P#person{id=P#person.id+Key} || P <- Persons ]. 

,但我有這個錯誤在sysntax:variable Persons is unbound

我嘗試解決此問題,此代碼:

testmodify()-> 
    Key=22, 
    [ P#person{id=P#person.id+Key} || P <- mnesia:table(person) ]. 

但我有此錯誤:

1> model:testmodify(). 
** exception error: no function clause matching 
        model:'-testmodify/0-lc$^0/1-0-'({qlc_handle, 
                 {qlc_table, 
                 #Fun<mnesia.20.112329951>, 
                 true, 
                 #Fun<mnesia.21.62211129>, 
                 #Fun<mnesia.22.75429001>, 
                 #Fun<mnesia.23.26336897>, 
                 #Fun<mnesia.26.62819299>, 
                 #Fun<mnesia.25.51075493>, 
                 #Fun<mnesia.24.47804912>, 
                 '=:=',undefined, 
                 no_match_spec}}) 

回答

1

假設你表存儲爲列表:

[ P#person{id=P#person.id+Key} || P <- Persons ]. 

UPDATE:對於Mnesia的表,你可以用QLC檢索類似的結果:

-include_lib("stdlib/include/qlc.hrl"). 
⋮ 
[ P#person{id=P#person.id+Key} || P <- mnesia:table(person) ]. 

注意,這只是給你的轉化人記錄列表。要更新記錄,您可能必須刪除現有記錄並在交易中寫入新記錄,因爲具有修改後的密鑰的記錄(假設這是id)被視爲不同的記錄 - 如下所示:

mnesia:transaction(fun() -> 
    Old = [ P       || P <- mnesia:table(person) ], 
    New = [ P#person{id=P#person.id+Key} || P <- Old ], 
    [ mnesia:delete({person, P#Person.id}) || P <- Old ], 
    [ mnesia:write(P) || P <- New ] 
end) 

您也許能mnesia:foldr做到這一點在一個單一的傳球,但我不知道如果發出mnesia:deletemnesia:writemnesia:foldr會發生什麼。你可能會陷入無限循環(但不要在此引用我)。

+0

我認爲爲了更新所有表格人物我們應該在循環中工作 – 2013-02-20 10:35:14

+0

@aliothmani:我不知道你是指Mnesia表格。上述解決方案適用於一個擁有'person'記錄列表的Person變量。 – 2013-02-20 21:25:14