[erlang-questions] Mnesia with Records Confusion

Robert Virding <>
Tue Apr 9 10:28:27 CEST 2013


Are you calling read/2 or index_read/3?

Robert

----- Original Message -----
> From: "Lee Sylvester" <>
> To: "Robert Virding" <>
> Cc: " Questions" <>
> Sent: Tuesday, 9 April, 2013 8:36:24 AM
> Subject: Re: [erlang-questions] Mnesia with Records Confusion
> 
> 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
> <> 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" <>
> >> To: " Questions"
> >> <>
> >> 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
> >> 
> >> http://erlang.org/mailman/listinfo/erlang-questions
> >> 
> 



More information about the erlang-questions mailing list