Похоже, вы должны отслеживать последний идентификатор вручную. Вы можете создать таблицу 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>