在erlang中更新多行表

时间:2013-02-20 13:51:07

标签: erlang

我想知道如何更新表的多个记录

例如,我有一个名为:交易

的表格

我想修改交易的 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 未更改

1 个答案:

答案 0 :(得分:0)

这取决于Type of Table,以及您在记录中更新的字段。很遗憾,您还没有告诉我们您的餐桌的一些细节。可以说,您正在基于给定字段更新多个记录。
注意我不建议使用单词transaction作为表名。但为了学习的目的,让我们继续。伪代码:

Get all records whose: Obj#transaction.field == Key
Then, Foreach, set: Obj#transaction.field == Key2
然后根据Query List Comprehension
-include_lib("stdlib/include/qlc.hrl").
select(Q)-> case mnesia:is_transaction() of false -> F = fun(QH)-> qlc:e(QH) end, mnesia:activity(transaction,F,[Q],mnesia_frag); true -> qlc:e(Q) end.
gen_update(FilterFun,UpdateFun)-> A = select(qlc:q([R || R <- mnesia:table(transaction),FilterFun(R) == true])), [UpdateFun(X) || X <- A], ok.
update_by_key(OldKey,NewKey)-> FilterFun = fun(#transaction{key = OldKey}) -> true; (_) -> false end, UpdateFun = fun(T) -> NewT = T#transaction{key = NewKey}, mnesia:write(NewT), ok end, gen_update(FilterFun,UpdateFun), ok.
考虑此示例 应该这样做。查看函数:gen_update。我使用funs创建了通用对象,它将根据任何所需的形式进行过滤,而另一个将进行更新。现在,您可以构建您选择的任何fun,只要它将记录作为参数。请注意,此方法可能适用于set类型的表,具体取决于您正在执行的操作。如果您按primary key进行更新,则需要进行一些新的更改。