Erlang:Mnesia:连续更新单个字段值

时间:2009-11-30 16:52:52

标签: database erlang mnesia

我有一个mnesia表,其中包含使用记录

创建的三个字段i,a和b
-record(rec, {i, a,b}).

现在我在表格中插入一行:

mnesia:transaction( fun() -> mnesia:write("T", #rec{i=1, a=2, b=3}, write) end ).

现在,如果我想更新此行,并且只将a的值更改为10,同时将i和b保留为相同的值,该怎么办?是否存在类似“UPDATE T SET a=10 WHERE i=1”的SQL等价物?

如果我这样做:

mnesia:transaction( fun() -> mnesia:write("T", #rec{i=1, a=10}, write) end )

该行存储为:

{rec,1,10,undefined}

2 个答案:

答案 0 :(得分:9)

如果在mnesia:transaction

中使用,此函数的值将更新
update_a(Tab, Key, Value) ->
  fun() ->
    [P] = mnesia:wread({Tab, Key}),
    mnesia:write(P#pixel{a=Value})
  end.

建议:如果你想要一些更像SQL语法的语法糖,请查看QLC。

性能当然是最佳基准测试,但QLC有开销,我不确定它们与其他细节相比是否相关。我只是想你所提供的SQL示例将更新所有i=1的记录。使用QLC提取该组记录比mnesia调用更漂亮。

另外要注意,wread直接声明对记录的写锁定,因为我们提前知道我们将更新该记录。这是一个微优化,以避免首先读取锁定,然后改变主意并获得写入锁定。我很长一段时间没有对此进行基准测试。

如果性能仍然存在问题,您应该查看使用脏操作的各种方法。但是你真的应该试着找出你需要的每秒交易次数,以便“足够快”。

答案 1 :(得分:2)

我相信您需要阅读“行”,更新您需要的任何字段,然后在“事务”中将所有这些操作的结果写回