微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

数据库 – 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保留为相同的值,我该怎么办?是否有任何sql等价的“UPDATE T SET a = 10 WHERE i = 1”?

如果我做这样的事情:

mnesia:transaction( fun() -> mnesia:write("T",a=10},write) end )

该行存储为:

{rec,1,10,undefined}

解决方法

如果在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直接声明对记录的写锁定,因为我们提前知道我们将更新该记录.这是一个微优化,以避免首先读取锁定,然后改变主意并获得写锁定.我在很长一段时间内没有对此进行基准测试.

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

原文地址:https://www.jb51.cc/mssql/77359.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐