Little Bobby Tables
Little Bobby Tables

Reputation: 5351

Create several Mnesia tables with the same columns

I want to create the following schema in Mnesia. Have three tables, called t1, t2 and t3, each of them storing elements of the following record:

-record(pe, {pid, event}).

I tried creating the tables with:

Attrs = record_info(fields, pe),
Tbls = [t1, t2, t3],
[mnesia:create_table(Tbl, [{attributes, Attrs}]) || Tbl <- Tbls],

and then write some content using the following line (P and E have values):

mnesia:write(t1, #pe{pid=P, event=E}, write)

but I got a bad type error. (Relevant commands were passed to transactions, so it's not a sync problem.)

All the textbook examples of Mnesia show how to create different tables for different records. Can someone please reply with an example for creating different tables for the same record?

Upvotes: 3

Views: 739

Answers (1)

Vincenzo Maggio
Vincenzo Maggio

Reputation: 3869

regarding your "DDT" for creating the tables, I don't see any mystake at first sight, just remember that using tables with names different from the record names makes you lose the "simple" commands (like mnesia:write/1) because they use element(1, RecordTuple) to retrieve table name.

When defining tables, you can use option {record_name, RecordName} (in your case: {record_name, pe}) to tell mnesia that first atom in tuple representing records in table is not the table name, but instead the atom you passed with record_name; so in case of your table t1 it makes mnesia expecting 'pe' records when inserting or looking up for records.

If you want to insert a record in all tables, you might use a script similar to the one used to create table (but in a function wrapper for mnesia transaction context):

insert_record_in_all_tables(Pid, Event, Tables) ->
    mnesia:transaction(fun() -> [mnesia:write(T, #pe{pid=Pid, event=Event}, write) ||  T <- Tables] end).

Hope this helps!

Upvotes: 1

Related Questions