语言陷阱:mnesia中关于index的选择

erlang使用mnesia进行数据库操作的时候出现的bad_type错误。
对于下面的数据结构:

       -record(info, {name, id}).
       

使用下面的语句来创建表:

       case mnesia:create_table(info, [
                                    {disc_copies, Nodes},
                                     {index, [name]},
                                    {type, set},
                                    {attributes, record_info(fields, info)}
                                     ]) of
        {atomic, ok} ->
            ok;
        Any ->
            error_logger:error_report([
                                       {message, "Cannot install table"},
                                       {table, info},
                                       {error, Any},
                                       {nodes, Nodes}])
    end.
       

编译的时候不会有任何问题,但运行的时候,会出现{aborted,{bad_type,info,{index,[2]}}}的错误,原因在于使用record的第一个元素来做index,如果不是第一个的话则没有任何问题。

语言陷阱:mnesia数据库中的record的顺序

昨天在erlang下弄了个数据库,当更新数据的时候,发现了一些些问题。数据类似下面的记录:

       -record(counter, {
	   type,
	   value
	   } ) .
       -record(class, {
                      name,
                      id}).
       

抱歉使用C++的高亮方式,没有erlang的高亮方式【换了个插件,支持了。】。
counter用来记录class中的数量,class中有两个数据段,名字和id。因为考虑一个名字和一个id对应,所以创建表的时候使用{type,set},{index, [id]}来设置。当我更新数据的时候,如果名字相同的话,后面更新的id会将前一个覆盖掉。比如{“张三”,02},{“张三”,04},记录完之后会只有一个{“张三”,04},很显然,后来的覆盖了之前存在的。但如果将class的结构编程这样:
继续阅读语言陷阱:mnesia数据库中的record的顺序