0

テーブルの複数のレコードを更新する方法を知りたい

たとえば、 トランザクションという名前のテーブルがあります

トランザクションのIDを 変更したい

私は成功せずに試します

  testupdate()->
        Key =20,
        Update=#transaction{id=Key} ,
    Fun = fun() ->
                  List = mnesia:match_object(Update),
                  lists:foreach(fun(X) ->
                                        mnesia:write_object(X)
                                end, List)
          end,
    mnesia:transaction(Fun).

テストしたところ、エラーは見つかりませんでした

1> model:testupdate().
{atomic,ok}

ただし、トランザクションのIDは変更されません

4

1 に答える 1

0

Type of Table、およびレコードで更新するフィールドに大きく依存します。残念ながら、あなたは私たちにあなたのテーブルについてのいくつかの詳細を教えてくれませんでした。たとえば、特定のフィールドに基づいて複数のレコードを更新しているとします。
テーブルtransaction名としてこの単語を使用することはお勧めしません。しかし、学習の目的で、続けましょう。擬似コード:

次のすべてのレコードを取得します:Obj#transaction.field == Key
次に、Foreachで次のように設定します。Obj#transaction.field == Key2
次に、この例に基づいて検討しますQuery List Comprehension
-include_lib( "stdlib / include / qlc.hrl")。
select(Q)-> ケースmnesia:is_transaction()of false-> F = fun(QH)-> qlc:e(QH)end、 mnesia:activity(transaction、F、[Q]、mnesia_frag); true-> qlc:e(Q) 終わり。
gen_update(FilterFun、UpdateFun)-> A = select(qlc:q([R || R <-mnesia:table(transaction)、FilterFun(R)== true]))、 [UpdateFun(X)|| X <-A]、 わかった。
update_by_key(OldKey、NewKey)-> FilterFun = fun(#transaction {key = OldKey})-> true; (_)-> false 終わり、 UpdateFun = fun(T)-> NewT = T#transaction {key = NewKey}、 mnesia:write(NewT)、 わかった 終わり、 gen_update(FilterFun、UpdateFun)、 わかった。
それはそれをする必要があります。関数を見てください:gen_update。私は以前funs、任意の形式に従ってフィルタリングする汎用オブジェクトと、更新を行う別のオブジェクトを作成していました。funこれで、引数としてレコードを受け取る限り、任意の選択肢を作成できます。この方法はset、実行している内容によっては、タイプのテーブルに適用できる場合があることに注意してください。で更新する場合はprimary key、いくつかの新しい変更を加える必要があります。

于 2013-02-21T06:32:36.493 に答える