在erlang中更新多条记录

时间:2013-02-20 15:16:18

标签: erlang

我有一个有这个记录的桌子人

-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

2 个答案:

答案 0 :(得分:1)

继续@legoscia的开始。您的代码还有一些问题:

  1. mnesia:match_object/1来电Update被用作模式,因此当您在{{1}中设置phone字段phone=NewPhone时你实际上是在对Update说给我所有match_object值为phone的记录。这不是你想要的。
  2. 您正在回写匹配的完全相同的记录。在回写之前,您没有更改记录。
  3. 解决方案可能是(未经测试):

    "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)

这里需要改变一些事情:

  1. 如果您要将记录用作mnesia:match_object的模板,则应使用原子'_'填写您不关心的记录字段。有一种特殊的语法可以做到这一点:

    Update=#person{phone=Newphone, _ = '_'}
    
  2. 您可能不希望Newphone在那里 - 您传递给match_object的记录应该与表中已有但应该更改的对象匹配,而不是您想要的要更改的对象。

    您想要更改哪些记录?这将确定您应该传递给match_object的内容。

  3. 您在事务中唯一要做的就是读取记录并将其写回。看看the Records chapter of the Erlang reference manual;您可能需要X#person{phone = Newphone}之类的内容来更改X中的电话字段。

  4. 函数mnesia:write_object不存在;你可能意味着mnesia:write