我想在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的所有教科书示例都展示了如何为不同的记录创建不同的表。有人可以回复一个例子,为同一记录创建不同的表吗?
答案 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).
希望这有帮助!