Как сгенерировать AUTR INCREMENT Id в Erlang Mnesia - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь записать записи в mnesia, и я хочу назначить уникальный идентификатор для каждой записи. Идентификатор должен быть автоматически увеличен.

Например, у меня есть таблица с 3 столбцами - Id, Name, DOB.

Запись 1 должна иметь Id = 1, Имя = Джо, DOB = 03-05-1994

Запись 2 должна иметь Id = 2, Имя = Алиса, DOB = 11-07-1991 и т. Д ...

Пожалуйста, помогите

1 Ответ

0 голосов
/ 10 января 2019

Похоже, вы должны отслеживать последний идентификатор вручную. Вы можете создать таблицу table_ids, которая отслеживает последний идентификатор, использованный при вставке записи в данную таблицу. Таблицу table_ids можно использовать для отдельного отслеживания последнего идентификатора, использованного во всех ваших разных таблицах.

В соответствии с документацией mnesia, вместо того, чтобы делать математику самостоятельно, читая последний идентификатор таблицы из таблицы table_ids, затем увеличивая последний идентификатор, затем записывая последний идентификатор обратно в таблицу table_ids, вместо Вы должны просто позвонить mnesia: dirty_update_counter () . Вот пример:

-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.

В iex:

~/erlang_programs/mnesia$ rm -rf Mnesia.nonode\@nohost/

~/erlang_programs/mnesia$ erl
Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]
Eshell V9.3  (abort with ^G)

1> c(my).                   
my.erl:2: Warning: export_all flag enabled - all functions will be exported
{ok,my}

2> my:init().               
{atomic,ok}

3> my:start_counter(people).
{atomic,ok}

4> my:insert("Joe", 22).    
{atomic,ok}

5> my:insert("Sue", 31).    
{atomic,ok}

6> my:select_all().         
[{person,1,"Joe",22},{person,2,"Sue",31}]

7> mnesia:stop().           
stopped

8> 
=INFO REPORT==== 9-Jan-2019::23:30:02 ===
    application: mnesia
    exited: stopped
    type: temporary

(Hit Return to get back to prompt)
8> 
...