我定义了一个名为的记录log.我想用名称创建一个mnesia表log_table.当我尝试将记录写入表时,我得到bad_type如下错误:
(node1@kitt)4> mnesia:create_table(log_table, [{ram_copies, [node()]},
{attributes, record_info(fields, log)}]).
{atomic,ok}
(node1@kitt)5> mnesia:dirty_write(log_table, #log{id="hebelek"}).
** exception exit: {aborted,{bad_type,#log{id = "hebelek"}}}
in function mnesia:abort/1
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
在Mnesia中是否有与此SQL语句等效的内容?
alter table TABLE
add foreign key (FIELD)
references TABLE2 (FIELD2)
Run Code Online (Sandbox Code Playgroud) 我查看了Mnesia文档和3本流行的Erlang书籍.似乎只能创建和使用单列主索引和辅助索引.或者也许它只是示例所涵盖的内容?如果我在每个列上创建一个单独的索引,Mnesia是否能够智能地一起使用它们来模拟多列密钥索引搜索?如果是这样,性能会比简单的表扫描好得多?
如果Mnesia不支持多列索引,则鉴于其本机dbms有任何人在Erlang中模拟此功能.
第二个问题:如何模拟约束(参考,检查),触发器和基于事件的通知?
我开始构建一个具有以下要求的项目:
我正在考虑使用Mnesia/Erlang作为这个项目的基础平台,但我想知道它(Mnesia)能够处理数据集上同时断开连接的冲突操作的情况.
一个说明性场景:
为简化起见,我们假设不需要完整的更改历史记录(例如,记录1用于包含ABC或DEF并不重要,它现在只包含GHI非常重要).
这是Mnesia的开箱即用(或简单实施)功能吗?
我在很多文档中都看到过Mnesia已经被爱立信开源了,但直截了当的谷歌搜索并没有帮助我找到代码库...
Mnesia仍然是开源的吗?
setup_mnesia(Name) ->
?VALUE(application:start(mnesia)),
?VALUE(mnesia:create_schema([node()|[Name]])),
?VALUE(mnesia:create_table(muppet, [
{attributes, record_info(fields, muppet)},
{disc_copies, [foo@kos13]}])),
?VALUE(mnesia:wait_for_tables([muppet], infinity)),
ok.
Run Code Online (Sandbox Code Playgroud)
结果是
"application:start(mnesia)"= ok
"mnesia:create_schema([node()| [Name]])"= {error,{foo @ kos13,{already_exists,foo @ kos13}}}
"mnesia:create_table(muppet,[{attributes,record_info(fields,muppet)},{disc_copies,[foo @ kos13]}])"= {aborted,{bad_type,muppet,disc_copies,foo @ kos13}}
EDITED,ADDED如果重写两个进程来调用应用程序:在mnesia之后启动:create_schema它吐出"无法安装回退".在当前目录中出现两个文件--FALLBACK.BUP和foo @ kos13131851070846165246847780.
我的代码有点问题.我有一个包含汽车详细信息,名称,价格和数量的表格,因此我正在尝试创建一个buy用于购买特定汽车的功能.当用户购买5辆宝马汽车时,他们会打电话buy_car(bmw,5).在此之后,我想更新宝马汽车的新数量值.
我的尝试在下面,但我似乎无法解决它,我是Erlang的新手.
buy_car(X,Ncars) ->
F = fun() ->
%% ----first i find the number of car X available in the shop
[Xcars] = mnesia:read({car,X}),
Nc = Xcars#car.quantity,
Leftcars = Xcars#car{quantity = Nc - Ncars},
%% ---now we update the database
mnesia:write(Leftcars),
end,
mnesia:transaction(F).
Run Code Online (Sandbox Code Playgroud)
请帮助我如何编写从商店购买汽车的功能.
Erlang一直是许多"新时代"(淫秽快速和容错)消息传递系统的良好应用.例如可以RabbitMQ的,ejabberd,WhatsApp的移动等不管邮件系统是如何构建的,它需要知道什么会话回事,谁登录,等我认为保持数据IN-MEMORY是不可避免的此类系统.
对于二郎,最大可能是什么,或者允许的最大什么或什么是在记录的正式通知最大数量ETS table还是mnesia RAM table?是否存在特定的表大小,如果超过则会导致整个VM崩溃?不要ETS Tables或Mnesia RAM Tables只要底层操作系统允许它增长到任何金额是多少?我听说过Mnesia Table Limit的2 or 4GB,但我认为这是对磁盘表.
那将需要处理大量的内存数据的未来应用的一个典型例子是OLAP Systems,Real Time analytics,Social Gaming等在这种思路已经激发了这个问题.
当我将原子作为信息发送时,原子是否从一个过程复制到另一个过程?我的想法是,因为这个原子已经存在于VM中,所以不必复制.我知道从一个进程发送到另一个进程时二进制文件更有效.
如果我发送一个触发器消息,从一个进程到另一个进程的常量消息,最好使用:atom或binary?
erlang ×10
mnesia ×10
architecture ×1
constraints ×1
database ×1
distributed ×1
elixir ×1
erlang-otp ×1
erlang-shell ×1
linux ×1
transactions ×1
unix ×1
windows ×1