使用 Erlang mnesia:read/2 Returns 没有
Using Erlang mnesia:read/2 Returns Nothing
我有一个 ram_copies mnesia 设置,我可以插入记录,我可以使用位于此处的以下代码打印它们:
开始记录:
-record(someRecord, {a=null, b=null}).
Table:
mnesia:create_table(someRecord,
[{attributes, record_info(fields, someRecord)},
{index, [#someRecord.b]},
{ram_copies, Nodes},
{type, set}]),
正在插入:
i(rA, rB) ->
F = fun() -> mnesia:write(#someRecord{a=rA, b=rB}) end,
mnesia:transaction(F).
阅读中:
r(rB) ->
F = fun() -> mnesia:read({someRecord, rB}) end,
mnesia:transaction(F).
这个returns {atomic, Result} 并且结果是空的。
想知道我做错了什么。
谢谢!
更新:事实证明,如果我使用记录 "a" 作为它们的键,它就可以工作。但为什么?我将其设置为记录 "b" 键。
{index, List}
选项指定元组 mnesia
的哪些元素应该索引。它不会更改 mnesia:read
搜索这些字段的行为。记录的第一个字段被视为主键并自动建立索引,并且是 mnesia:read
搜索的字段。要针对任何其他元素进行查询,您需要使用 mnesia:index_read
并指定元素的索引:
mnesia:index_read(someRecord, B, #someRecord.b)
另请注意,由于您的 table 类型是 set
,并且记录的第一个字段是主键,因此您将无法存储多个相同的记录a
的值。如果您希望 b
成为主键和 set
检测到重复项的键,则必须重新排序记录的字段并将 b
移动到 [=17 之前=].如果这样做,则不需要指定任何 index
选项,并且还可以使用 mnesia:read
而不是 mnesia:index_read
。这也应该更有效,因为 mnesia
不必维护额外的索引。
我有一个 ram_copies mnesia 设置,我可以插入记录,我可以使用位于此处的以下代码打印它们:
开始记录:
-record(someRecord, {a=null, b=null}).
Table:
mnesia:create_table(someRecord,
[{attributes, record_info(fields, someRecord)},
{index, [#someRecord.b]},
{ram_copies, Nodes},
{type, set}]),
正在插入:
i(rA, rB) ->
F = fun() -> mnesia:write(#someRecord{a=rA, b=rB}) end,
mnesia:transaction(F).
阅读中:
r(rB) ->
F = fun() -> mnesia:read({someRecord, rB}) end,
mnesia:transaction(F).
这个returns {atomic, Result} 并且结果是空的。
想知道我做错了什么。
谢谢!
更新:事实证明,如果我使用记录 "a" 作为它们的键,它就可以工作。但为什么?我将其设置为记录 "b" 键。
{index, List}
选项指定元组 mnesia
的哪些元素应该索引。它不会更改 mnesia:read
搜索这些字段的行为。记录的第一个字段被视为主键并自动建立索引,并且是 mnesia:read
搜索的字段。要针对任何其他元素进行查询,您需要使用 mnesia:index_read
并指定元素的索引:
mnesia:index_read(someRecord, B, #someRecord.b)
另请注意,由于您的 table 类型是 set
,并且记录的第一个字段是主键,因此您将无法存储多个相同的记录a
的值。如果您希望 b
成为主键和 set
检测到重复项的键,则必须重新排序记录的字段并将 b
移动到 [=17 之前=].如果这样做,则不需要指定任何 index
选项,并且还可以使用 mnesia:read
而不是 mnesia:index_read
。这也应该更有效,因为 mnesia
不必维护额外的索引。