[erlang-questions] Mnesia with Records Confusion

Lee Sylvester lee.sylvester@REDACTED
Tue Apr 9 08:36:24 CEST 2013


Thank you.  Now I understand. However, removing the index attribute and the I'd field causes everything to fail. I end up with the same error mentioned before.

So confusing :-(

Thanks,
Lee


On 9 Apr 2013, at 01:47, Robert Virding <robert.virding@REDACTED> wrote:

> Mnesia uses the first record field, 'pid' in your case, as the *primary* index of a table. This is the key which is used when you do a straight read(Tab, Key). Adding an explicit {index,Keys} element to the table definition creates *extra* index tables for the table using that the fields in the Keys list. In your case 'pid''. Again.
> 
> I am guessing that having a field as both the primary key and an extra key causes it to fail. So when you insert a new first field 'id' this then becomes the primary key and you extra key 'pid' is no longer the primary key so it works.
> 
> Actually in this case explicitly defining the the first record field as a key is totally unnecessary as it it is already the primary key. Even if it worked. :-) And adding an extra first field 'id' just so you can can use the 'pid' field as an index and read it with index_read/3 is duplicating the work and is unnecessary.
> 
> If it is as you described it.
> 
> Robert
> 
> ----- Original Message -----
>> From: "Lee Sylvester" <lee.sylvester@REDACTED>
>> To: "erlang-questions@REDACTED Questions" <erlang-questions@REDACTED>
>> Sent: Tuesday, 9 April, 2013 12:06:42 AM
>> Subject: [erlang-questions] Mnesia with Records Confusion
>> 
>> Hey guys,
>> 
>> So, I have a record that looks a little like this
>> 
>> -record(user, {pid, username}).
>> 
>> That's a simplified version.  Anyhoo, I was trying to add it to and
>> remove it from a table in Mnesia, but kept getting a badarg error.
>> I'd set the table up like so:
>> 
>>    mnesia:create_table(user,
>>        [
>>            {type,set},
>>            {record_name, user},
>>            {index, [pid]},
>>            {attributes, record_info(fields, user)}
>>        ]),
>> 
>> This error had me baffled for a while as I was able to add records to
>> the table, but couldn't read them with index_read.  I eventually
>> found that the issue was to do with the index of the pid property in
>> the record and, by adding an id property as the first field, all my
>> problems disappeared.
>> 
>> Can someone please explain why this is so?  I mean, I'm glad it works
>> now, but I'd love to know why I had to do this.
>> 
>> Thanks loads,
>> Lee
>> 
>> _______________________________________________
>> erlang-questions mailing list
>> erlang-questions@REDACTED
>> http://erlang.org/mailman/listinfo/erlang-questions
>> 



More information about the erlang-questions mailing list