[Erlang]Mnesia设置主键自增

Mnesia是erlang/otp自带的分布式数据库管理系统。mnesia配合erlang的实现近乎理想,但在实际使用当中差强人意,总会有一些不足。mnesia数据表没有主键自增的功能,但在mnesia函数中有一个自增函数可以用来生成自增的id,在后面的内容将讲述如何实现主键自增的功能。

参照SQLite的做法,就是在数据库中单独建立一个的sqlite_sequence表来做其他表的自增索引表。同样,我们也创建这样一个表erlang_sequence,用来索引其他表的自增id,看似麻烦,效果还是很理想。

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. -module(m).  
  2. -export([init/0, reg/2]).  
  3. -record(user, {id, name, age}).  
  4. -record(erlang_sequence, {name, seq}).%自增索引表,维护其他表的自增id  
  5.   
  6. init() ->  
  7.     mnesia:create_schema([node()]),  
  8.     mnesia:start(),  
  9.     mnesia:create_table(erlang_sequence, [{attributes, record_info(fields,  
  10.       erlang_sequence)} , {type,set}, {disc_copies, [node()]} ]),  
  11.     mnesia:create_table(user, [{attributes, record_info(fields, user)} ,  
  12.       {type,set}, {disc_copies, [node()]} ]),  
  13.     ok.  
  14.   
  15. reg(Name, Age) ->  
  16.     F = fun() ->  
  17.         UserId = mnesia:dirty_update_counter(erlang_sequence, user, 1),  
  18.         User = #user{id = UserId, name = Name, age = Age },  
  19.         mnesia:write(User)  
  20.     end,  
  21.     mnesia:transaction(F),  
  22.     ok.  

运行代码:

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. D:\>erl -mnesia dir '"mnesia"'  
  2. Eshell V5.10.2  (abort with ^G)  
  3. 1> c(m).  
  4. {ok,m}  
  5. 2> m:init().  
  6. ok  
  7. 3> m:reg("xiaomin",18).  
  8. ok  
  9. 4> m:reg("xiaohong",17).  
  10. ok  
  11. 5> tv:start().  
  12. <0.92.0>  

Mnesia数据库视图:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值