使用相同的列创建多个Mnesia表

时间:2011-07-25 09:26:16

标签: erlang mnesia

我想在Mnesia中创建以下架构。有三个表,称为t1,t2和t3,每个表都存储以下记录的元素:

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

我尝试用:

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

然后使用以下行写出一些内容(P和E有值):

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

但是我遇到了错误的类型错误。 (相关命令已传递给事务,因此不是同步问题。)

Mnesia的所有教科书示例都展示了如何为不同的记录创建不同的表。有人可以回复一个例子,为同一记录创建不同的表吗?

1 个答案:

答案 0 :(得分:1)

关于创建表的“DDT”,我没有看到任何一见不到的错误,只记得使用名称与记录名称不同的表会让你失去“简单”命令(如mnesia:write / 1)因为他们使用元素(1,RecordTuple)来检索表名。

定义表时,可以使用选项{record_name,RecordName}(在您的情况下:{record_name,pe})告诉mnesia表示表中记录的元组中的第一个原子不是表名,而是原子你用record_name传递;所以在你的表t1的情况下,它使得mnesia在插入或查找记录时期望'pe'记录。

如果要在所有表中插入记录,可以使用类似于用于创建表的脚本(但在mnesia事务上下文的函数包装器中):

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

希望这有帮助!