我有一个有这个记录的桌子人
-record(person, {id, firstname, lastname, phone}).
我想更新此表所有记录的电话 Itry with
test()->
Newphone ="216",
Update=#person{phone=Newphone} ,
Fun = fun() ->
List = mnesia:match_object(Update),
lists:foreach(fun(X) ->
mnesia:write_object(X)
end, List)
end,
mnesia:transaction(Fun).
表人包含
12 alen dumas 97888888
15 franco mocci 55522225
13 ali othmani 44444449
我希望这张桌子变成这样:
12 alen dumas 216
15 franco mocci 216
13 ali othmani 216
我尝试:
test()->
Newphone ="216",
Update=X#person{phone=Newphone, _ = '_'}
Fun = fun() ->
List = mnesia:match_object(Update),
lists:foreach(fun(X) ->
mnesia:write(X)
end, List)
end,
mnesia:transaction(Fun).
但是使用此代码我有这个错误:
Variable X is unbound
这与这一行有关:
Update=X#person{phone=Newphone, _ = '_'}
解决这个问题我做了:
test()->
Newphone ="216",
Update=#person{phone=Newphone, _ = '_'}
Fun = fun() ->
List = mnesia:match_object(Update),
lists:foreach(fun(X) ->
mnesia:write(X)
end, List)
end,
mnesia:transaction(Fun).
当我测试时,我收到了这条消息:
{atomic,ok}
但是当我咨询数据库时,我发现记录没有改变
我的代码中的难点是更改表格人员的所有记录
所以改变 97888888 和 55522225 和 44444449
此值应变为 216
答案 0 :(得分:1)
继续@legoscia的开始。您的代码还有一些问题:
mnesia:match_object/1
来电Update
被用作模式,因此当您在{{1}中设置phone
字段phone=NewPhone
时你实际上是在对Update
说给我所有match_object
值为phone
的记录。这不是你想要的。解决方案可能是(未经测试):
"216"
您在test()->
Newphone ="216",
Match=#person{_ = '_'}, %Will match all records
Fun = fun() ->
List = mnesia:match_object(Match),
lists:foreach(fun(X) ->
%% Create new record with phone=NewPhone and write it back
Update = X#person{phone=NewPhone},
mnesia:write(Update)
end, List)
end,
mnesia:transaction(Fun).
中设置的所有字段都将限制您在Match
中匹配的记录。例如,match_object
将匹配所有具有电话Match = #person{phone="123",_='_'}
的记录。
答案 1 :(得分:0)
这里需要改变一些事情:
如果您要将记录用作mnesia:match_object的模板,则应使用原子'_'
填写您不关心的记录字段。有一种特殊的语法可以做到这一点:
Update=#person{phone=Newphone, _ = '_'}
您可能不希望Newphone
在那里 - 您传递给match_object
的记录应该与表中已有但应该更改的对象匹配,而不是您想要的要更改的对象。
您想要更改哪些记录?这将确定您应该传递给match_object
的内容。
您在事务中唯一要做的就是读取记录并将其写回。看看the Records chapter of the Erlang reference manual;您可能需要X#person{phone = Newphone}
之类的内容来更改X
中的电话字段。
函数mnesia:write_object
不存在;你可能意味着mnesia:write。