-1

我有这张桌子:

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

例如,此表包含以下值:

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

现在我有了 Key 包含这个值 的变量10

我想在 erlang 中开发一个函数,它将修改所有idperson

this 的新值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}})
4

1 回答 1

1

假设您的表存储为列表:

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

更新:对于 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:writeinside会发生什么mnesia:foldr。你可能会陷入无限循环(但不要引用我的话)。

于 2013-02-20T09:17:47.010 回答