我想知道如何更新表的多个记录
例如,我有一个名为:交易
的表格我想修改交易的 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 未更改
答案 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
进行更新,则需要进行一些新的更改。