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

发布于 2024-08-13 04:05:32 字数 525 浏览 5 评论 0原文

我有一个包含三个字段 i、a 和 b 的 mnesia 表,是使用记录创建的

-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}

I have an mnesia table with three fields, i, a and b, created using the record

-record(rec, {i, a,b}).

Now I insert a row into the table as:

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

Now what do I do if I want to update this row, and change only the value of a to 10, while leaving i and b with the same values? Is there any SQL equivalent like "UPDATE T SET a=10 WHERE i=1"?

If I do something like this:

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

The row is stored as:

{rec,1,10,undefined}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

独自唱情﹋歌 2024-08-20 04:05:32

如果在 mnesia:transaction 中使用,该函数的值将更新 a。

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

如果性能仍然是一个问题,您应该考虑使用脏操作的各种方法。但您确实应该尝试弄清楚每秒需要多少事务,才能“足够快”。

The value of this function will update a if used in a mnesia:transaction

update_a(Tab, Key, Value) ->
  fun() ->
    [P] = mnesia:wread({Tab, Key}),
    mnesia:write(P#pixel{a=Value})
  end.

Suggestion: have a peek at QLC if you want some syntax sugar that is more like the SQL syntax.

The performance is of course best benchmarked, but QLC has overhead, I'm not sure they are relevant compared to the other details. I just figured that the SQL example you gave would update all records that have i=1. Using QLC to extract that set of records is prettier than mnesia calls.

Also to notice, wread claims a write lock on the record directly, because we know ahead of time that we will update that record. That's a micro-optimization to avoid first a read lock, then change our mind and get a write lock. I haven't benchmarked that in a long time though.

If performance is still an issue you should look at various approaches where you use dirty operations. But you really should try to figure out how many transactions per second you need, to be 'fast enough'.

神回复 2024-08-20 04:05:32

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

I believe you need to read the "row", update whatever field you need, and then write back the result and all of these operations within a "transaction".

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文