使用Erlang mnesia:read / 2返回Nothing

时间:2017-08-11 02:01:49

标签: erlang otp mnesia

我有一个ram_copies mnesia设置,我可以插入记录,我可以使用以下代码打印它们:How to read all the records of mnesia database in erlang?

开始记录:

-record(someRecord, {a=null, b=null}).

表:

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).

返回{atomic,Result},Result为空。

想知道我做错了什么。

谢谢!

更新:事实证明,如果我使用记录" a"因为他们关键它有效。但为什么?我准备好记录" b"关键。

1 个答案:

答案 0 :(得分:1)

{index, List}选项指定元组mnesia的哪些元素应该索引。它不会更改mnesia:read搜索这些字段的行为。记录的第一个字段被视为主键并自动编入索引,并且是mnesia:read次搜索。要对任何其他元素进行查询,您需要使用mnesia:index_read并指定元素的索引:

mnesia:index_read(someRecord, B, #someRecord.b)

另请注意,由于您的表格类型为set,并且记录的第一个字段是主键,因此您将无法存储多个具有相同值{{1}的记录}。如果您希望a成为主键和b检测到重复项的键,则必须重新排序记录的字段并将set移至{{1}之前}}。如果您这样做,则无需指定任何b选项,您也可以使用a代替index。这应该更有效率,因为mnesia:read不需要维护额外的索引。