更新erlang中的所有表行

时间:2013-02-20 08:59:51

标签: erlang

我有这张桌子:

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

例如,此表包含以下值:

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

现在我的变量Key包含此值10

我想在erlang中开发一个函数,它将修改表id的所有person

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 个答案:

答案 0 :(得分: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:delete内发出mnesia:writemnesia:foldr会发生什么。你可能陷入无限循环(但不要引用我)。