Mnesia数据库的操作和以前习惯的SQL数据库操作几乎完全不同,刚开始用很不使用。现将常见的读写操作整理于下:
1、脏读
mnesia:dirty_read(Tab,Key)->ValueList | exit({aborted,Reason})
示例:
对于set类型的表,这个操作返回一个值或者空表,因为set类型表键值不可重复。如果对bag类型(键值可重复,但不能同键又同值)用脏读,结果是一个或若干值的列表,一个值都没有就是个空表。
示例:
2、脏写
mnesia:dirty_write(Tab,Record) -> ok | exit({abouted,Reason})
示例:
3、读read
这个操作,只能用在事务中,所以也不能直接在shell里使用。
示例:
4、写write
同上,普通的写操作也必须在事务中完成,否则会报错。
示例:
小结:read和write都是用于事务的,在不使用事务的时候,直接用dirty_read和dirty_write。
另,以上2种读操作都是按照主键进行查询。
5、使用带匹配规范的mnesia:select
这个命令也必须放到事务中才能执行。第一个参数是要查询的表,第二个参数是匹配规范。是个{Head,Conditions,Results}格式的三元组。
Head是个Erlang项式,用于描述查询模式,其中的'$1','$2'等原子用于表示变量,其对应于记录中第一个、第二个字段,以此类推。
‘_’(仅仅限于在Head部分使用),表示无所谓,任意值都可以匹配,示例:
'$$'(仅仅限于Results和Conditions中使用),等价于罗列出依次在Head部分匹配的所有变量'$1','$1','$1'等,示例参见上图。这个主要用于我们只对查询结果的部分字段感兴趣的时候用,不需要把整条记录都选择出来。
'$_'(仅仅限于Results和Conditions中使用),表示与查询条件相匹配的整条记录,示例:
6、使用查询列表速构(QLC)
QLC的全称是Query List Comprehension。表面看,它类似于普通的列表速构,使用时,又必须嵌套于外观类似于函数调用的qlc:q()中使用。实际上外层的qlc:q(...)只是一个标记,用于让编译器区别对待其中的表达式。要启用该功能,模块源码中必须加上下面这一行:
-include_lib("stdlib/include/qlc.hrl").
但作为特例,可以直接在Erlang shell中使用qlc:q(...)。也可以在事务中使用QLC,任何可以在事务中使用的Mnesia函数都可以与QLC混合使用。
示例:
上图是仅仅获取users表中的acc字段。
这是获取users表中的整条记录。
有关QLC的更多复杂用法,可以参见Erlang之父Joe Armstrong的新作《Programming Erlang, 2nd》第20章,“Mnesia:The Erlang Database”,326页。其中涉及到比如“2个表联合查询”。
QLC在erl源码中的用法示例:
7、删除mnesia:delete
要从数据库删除一行,需要知道该行的对象ID(OID)。对象ID由一个由表名和主键构成的二元组。
示例:
8、更新操作
Mnesia数据表里没有UPDATE的概念,如果要修改某条记录,根据表的不同类型,可以先删除,再插入新的记录,或者直接添加新记录代替旧的记录。
9、事务操作
事务代码的结构: