我有这张桌子:
-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}})
答案 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:write
和mnesia:foldr
会发生什么。你可能陷入无限循环(但不要引用我)。