3

我想在 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 的所有教科书示例都展示了如何为不同的记录创建不同的表。有人可以回复一个为同一记录创建不同表的示例吗?

4

1 回答 1

1

关于创建表的“DDT”,乍一看,我没有看到任何问题,请记住,使用名称与记录名称不同的表会使您丢失“简单”命令(例如 mnesia:write/1),因为他们使用 element(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).

希望这可以帮助!

于 2011-07-25T10:05:28.790 回答