mnesia是erlang/otp自带的分布式数据库管理系统。mnesia配合erlang的实现近乎理想,但在实际使用当中差强人意,总会有一些不足。mnesia数据表没有主键自增的功能,但在mnesia函数中有一个自增函数可以用来生成自增的id,在后面的内容将讲述如何实现主键自增的功能。
参照sqlite的做法,就是在数据库中单独建立一个的sqlite_sequence表来做其他表的自增索引表。同样,我们也创建这样一个表erlang_sequence,用来索引其他表的自增id,看似麻烦,效果还是很理想。
-module(m).-export([init/0, reg/2]).-record(user, {id, name, age}).-record(erlang_sequence, {name, seq}).%自增索引表,维护其他表的自增idinit() -> mnesia:create_schema([node()]), mnesia:start(), mnesia:create_table(erlang_sequence, [{attributes, record_info(fields, erlang_sequence)} , {type,set}, {disc_copies, [node()]} ]), mnesia:create_table(user, [{attributes, record_info(fields, user)} , {type,set}, {disc_copies, [node()]} ]), ok.reg(name, age) -> f = fun() -> userid = mnesia:dirty_update_counter(erlang_sequence, user, 1), user = #user{id = userid, name = name, age = age }, mnesia:write(user) end, mnesia:transaction(f), ok.
运行代码:
d:\>erl -mnesia dir 'mnesia'eshell v5.10.2 (abort with ^g)1> c(m).{ok,m}2> m:init().ok3> m:reg(xiaomin,18).ok4> m:reg(xiaohong,17).ok5> tv:start().
mnesia数据库视图:
