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")。
选择(Q)-> 案例记忆:is_transaction() 的 假-> F = fun(QH)-> qlc:e(QH) 结束, mnesia:activity(transaction,F,[Q],mnesia_frag); 真-> qlc:e(Q) 结尾。
gen_update(FilterFun,UpdateFun)-> A = select(qlc:q([R || R <- mnesia:table(transaction),FilterFun(R) == true])), [更新乐趣(X) || X <- A], 好的。
update_by_key(OldKey,NewKey)-> FilterFun = fun(#transaction{key = OldKey}) -> true; (_) -> 错误 结尾, UpdateFun = 乐趣(T)-> NewT = T#transaction{key = NewKey}, 记忆:写(NewT), 好的 结尾, gen_update(FilterFun,UpdateFun), 好的。
那应该这样做。看函数:gen_update。我曾经funs创建过通用对象,它们将根据任何所需的形式进行过滤,另一个将进行更新。fun现在,只要将记录作为参数,您就可以构建任何选择。请注意,此方法可能适用于 type 的表set,具体取决于您在做什么。如果您是通过 更新primary key,那么,您需要进行一些新的更改。

于 2013-02-21T06:32:36.493 回答