2017-08-11 76 views
1

我有一個ram_copies Mnesia的設置,我可以插入記錄,我可以在他們使用位於此處下面的代碼打印:How to read all the records of mnesia database in erlang?使用Erlang的Mnesia的:讀/ 2。返回無

開始記錄:

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

此返回{原子,結果}和結果是空的。

想知道我做錯了什麼。

謝謝!

更新:事實證明,如果我使用記錄「a」,因爲它們的鍵是有效的。但爲什麼?我已經設置爲鍵記錄「b」。

+0

這是否工作:'mnesia:index_read(someRecord,B,#someRecord.b)'? – Dogbert

+0

@Dogbert工作。然而,爲什麼create_table有一個不是用於「{index,[#someRecord.b]}」的鍵值(除非我使用錯誤)。如果我將rB替換爲「a」,read/2將適用於我。似乎關鍵是第一個元素,這是硬編碼嗎?另外,使用index_read和read有什麼影響? – Mike5050

+0

我已經發布了除最後一個問題以外的所有問題的答案。我不確定這種影響。我相信它應該像搜索第一個字段一樣快,但是由於額外的索引mnesia需要維護,所以在其他操作中會有開銷。 – Dogbert

回答

1

{index, List}選項指定元組mnesia中哪些元素應該編入索引。它不會更改mnesia:read來搜索這些字段的行爲。記錄的第一個字段被視爲主鍵並自動編入索引,並且是一個搜索。爲了使查詢針對任何其他元素,你需要使用mnesia:index_read,並指定元素的索引:

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

還要注意,由於該類型的表是set和記錄的第一個字段是主鍵,您將無法存儲具有相同值a的多個記錄。如果您希望b成爲主鑰匙,並且set檢測到重複的鑰匙,則必須對記錄的字段進行重新排序,並將b移至a之前。如果你這樣做,你不需要指定任何index選項,你也可以使用mnesia:read而不是mnesia:index_read。這應該更有效率,因爲mnesia不必維護額外的索引。

+0

我對「索引」在這裏指的是什麼有點困惑,以及對選擇說一個字符串作爲索引vs列表vs列表字節等等的影響。謝謝! – Mike5050