如何在Erlang Mnesia中生成AUTO INCREMENT ID

时间:2019-01-09 19:20:26

标签: database erlang elixir mnesia

我正在尝试将记录写入到Mnesia,并且我想为每个记录分配一个唯一的ID。 ID需要自动递增。

例如,我有一个包含3列的表格-ID,名称,DOB。

记录1应该具有ID = 1,名称= Joe,DOB = 1994年3月5日

记录2的ID应该为2,名称为Alice,DOB = 1991年11月7日,依此类推...

请帮助

1 个答案:

答案 0 :(得分:1)

您似乎必须手动跟踪最后一个ID。您可以创建一个table_ids表,该表跟踪在给定表中插入记录时使用的最后一个ID。 table_ids表可用于分别跟踪所有不同表中使用的最后一个ID。

根据mnesia docs,而不是自己通过从table_ids表中读取表的最后一个id,然后递增最后的id,然后将最后的id写回到{{1} }表,您只需调用mnesia:dirty_update_counter()。这是一个示例:

table_ids

在iex中:

-module(my).
-compile(export_all).
-include_lib("stdlib/include/qlc.hrl"). 

-record(person, {id, name, age}).
-record(table_id, {table_name, last_id}).

init() ->
    mnesia:create_schema([node()]),
    mnesia:start(),

    {atomic, ok} = mnesia:create_table(people, [ 
       {record_name, person},
       {attributes, record_info(fields, person)}
    ]),

    {atomic, ok} = mnesia:create_table(table_ids, [
       {record_name, table_id},
       {attributes, record_info(fields, table_id)}
    ]).

start_counter(TableName) ->
    Fun = fun() ->
                mnesia:write(table_ids, 
                  #table_id{table_name=TableName, last_id=0}, 
                  write
                )
          end,
    {atomic, ok} = mnesia:transaction(Fun).



insert(Name, Age) ->
    Index = mnesia:dirty_update_counter(table_ids, people, 1),
    Fun = fun() ->
                mnesia:write(people,
                    #person{id=Index, name=Name, age=Age},
                    write
                )
          end,
    {atomic, ok} = mnesia:transaction(Fun).

select_all() -> 
    {atomic, People} = mnesia:transaction(
         fun() ->
              qlc:eval(
                qlc:q([X || X <- mnesia:table(people)])
              )
         end
    ),
    People.