-1

この記録を持つテーブルパーソンがいます

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

このテーブルのすべてのレコードの電話を更新したいItrywith

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}

しかし、データベースを調べると、レコードが変更されていないことがわかりました

私のコードの難しさは、テーブルの人のすべてのレコードを変更することです

したがって、 978888885552222544444449を変更します

この値は216になるはずです

4

2 に答える 2

1

@legoscia が始めたことの続きです。コードにはいくつかの問題が残っています。

  1. mnesia:match_object/1呼び出しではパターンUpdateとして使用されているため、フィールドを設定すると、実際には値を持つすべてのレコードを提供するように言っています。これはあなたが望むものではありません。phonephone=NewPhoneUpdatematch_objectphone"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",_='_'}phone を持つすべてのレコードに一致します"123"

于 2013-02-21T00:41:40.690 に答える