-1

我有这个记录的表人

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

我想更新这个表 Itry 的所有记录的电话

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

person包含

 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}

但是当我查阅数据库时,我发现记录没有改变

我的代码中的困难是更改表 person 的所有记录

所以改变978888885552222544444449

这个值应该变成216

4

2 回答 2

1

继续@legoscia 的开始。您的代码存在几个问题:

  1. mnesia:match_object/1通话Update中被用作一种模式,因此当您在其中设置phone字段phone=NewPhone时,Update您实际上是在说match_object给我所有具有phone价值的记录"216"。这不是你想要的。
  2. 您正在写回与匹配的完全相同的记录。在写回记录之前,您不会更改记录。

解决方案可能是(未经测试):

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",_='_'}将匹配所有具有电话的记录"123"

于 2013-02-21T00:41:40.690 回答
0

这里有几件事需要改变:

  1. 如果你打算使用一条记录作为mnesia:match_object的模板,你应该用 atom 填写你不关心的记录字段'_'。有一种特殊的语法可以做到这一点:

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

    您要更改哪些记录?这将决定你应该传递给match_object.

  3. 您在事务中唯一要做的就是读取记录并将它们原封不动地写回。查看Erlang 参考手册的记录章节;您可能想要X#person{phone = Newphone}更改中的电话字段X

  4. 该功能mnesia:write_object不存在;您可能的意思是mnesia:write

于 2013-02-20T15:32:33.837 回答