mnesia mysql_Mnesia数据库操作整理(1)

Mnesia数据库的操作和以前习惯的SQL数据库操作几乎完全不同,刚开始用很不使用。现将常见的读写操作整理于下: 1、脏读 mnesia:dirty_read(Tab,Key)-ValueList | exit({aborted,Reason}) 示例: 对于set类型的表,这个操作返回一个或者空表,因为set类型表键

Mnesia数据库的操作和以前习惯的SQL数据库操作几乎完全不同,刚开始用很不使用。现将常见的读写操作整理于下:

1、脏读

mnesia:dirty_read(Tab,Key)->ValueList | exit({aborted,Reason})

示例:

test.jsp?url=http%3A%2F%2Fimg.blog.csdn.net%2F20140627101956843%3Fwatermark%2F2%2Ftext%2FaHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3RyOTk5X2Nu%2Ffont%2F5a6L5L2T%2Ffontsize%2F400%2Ffill%2FI0JBQkFCMA%3D%3D%2Fdissolve%2F70%2Fgravity%2FSouthEast&refer=http%3A%2F%2Fblog.csdn.net%2Fstr999_cn%2Farticle%2Fdetails%2F35223509

对于set类型的表,这个操作返回一个值或者空表,因为set类型表键值不可重复。如果对bag类型(键值可重复,但不能同键又同值)用脏读,结果是一个或若干值的列表,一个值都没有就是个空表。

示例:

test.jsp?url=http%3A%2F%2Fimg.blog.csdn.net%2F20140627134449062%3Fwatermark%2F2%2Ftext%2FaHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3RyOTk5X2Nu%2Ffont%2F5a6L5L2T%2Ffontsize%2F400%2Ffill%2FI0JBQkFCMA%3D%3D%2Fdissolve%2F70%2Fgravity%2FSouthEast&refer=http%3A%2F%2Fblog.csdn.net%2Fstr999_cn%2Farticle%2Fdetails%2F35223509

2、脏写

mnesia:dirty_write(Tab,Record) -> ok | exit({abouted,Reason})

示例:

test.jsp?url=http%3A%2F%2Fimg.blog.csdn.net%2F20140627105012578%3Fwatermark%2F2%2Ftext%2FaHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3RyOTk5X2Nu%2Ffont%2F5a6L5L2T%2Ffontsize%2F400%2Ffill%2FI0JBQkFCMA%3D%3D%2Fdissolve%2F70%2Fgravity%2FSouthEast&refer=http%3A%2F%2Fblog.csdn.net%2Fstr999_cn%2Farticle%2Fdetails%2F35223509

3、读read

这个操作,只能用在事务中,所以也不能直接在shell里使用。

示例:

test.jsp?url=http%3A%2F%2Fimg.blog.csdn.net%2F20140627111903796%3Fwatermark%2F2%2Ftext%2FaHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3RyOTk5X2Nu%2Ffont%2F5a6L5L2T%2Ffontsize%2F400%2Ffill%2FI0JBQkFCMA%3D%3D%2Fdissolve%2F70%2Fgravity%2FSouthEast&refer=http%3A%2F%2Fblog.csdn.net%2Fstr999_cn%2Farticle%2Fdetails%2F35223509

4、写write

同上,普通的写操作也必须在事务中完成,否则会报错。

示例:

test.jsp?url=http%3A%2F%2Fimg.blog.csdn.net%2F20140627112709687%3Fwatermark%2F2%2Ftext%2FaHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3RyOTk5X2Nu%2Ffont%2F5a6L5L2T%2Ffontsize%2F400%2Ffill%2FI0JBQkFCMA%3D%3D%2Fdissolve%2F70%2Fgravity%2FSouthEast&refer=http%3A%2F%2Fblog.csdn.net%2Fstr999_cn%2Farticle%2Fdetails%2F35223509

小结:read和write都是用于事务的,在不使用事务的时候,直接用dirty_read和dirty_write。

另,以上2种读操作都是按照主键进行查询。

5、使用带匹配规范的mnesia:select

test.jsp?url=http%3A%2F%2Fimg.blog.csdn.net%2F20140627160808406%3Fwatermark%2F2%2Ftext%2FaHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3RyOTk5X2Nu%2Ffont%2F5a6L5L2T%2Ffontsize%2F400%2Ffill%2FI0JBQkFCMA%3D%3D%2Fdissolve%2F70%2Fgravity%2FSouthEast&refer=http%3A%2F%2Fblog.csdn.net%2Fstr999_cn%2Farticle%2Fdetails%2F35223509

test.jsp?url=http%3A%2F%2Fimg.blog.csdn.net%2F20140627161802109%3Fwatermark%2F2%2Ftext%2FaHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3RyOTk5X2Nu%2Ffont%2F5a6L5L2T%2Ffontsize%2F400%2Ffill%2FI0JBQkFCMA%3D%3D%2Fdissolve%2F70%2Fgravity%2FSouthEast&refer=http%3A%2F%2Fblog.csdn.net%2Fstr999_cn%2Farticle%2Fdetails%2F35223509

这个命令也必须放到事务中才能执行。第一个参数是要查询的表,第二个参数是匹配规范。是个{Head,Conditions,Results}格式的三元组。

Head是个Erlang项式,用于描述查询模式,其中的'$1','$2'等原子用于表示变量,其对应于记录中第一个、第二个字段,以此类推。

‘_’(仅仅限于在Head部分使用),表示无所谓,任意值都可以匹配,示例:

test.jsp?url=http%3A%2F%2Fimg.blog.csdn.net%2F20140627163746390%3Fwatermark%2F2%2Ftext%2FaHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3RyOTk5X2Nu%2Ffont%2F5a6L5L2T%2Ffontsize%2F400%2Ffill%2FI0JBQkFCMA%3D%3D%2Fdissolve%2F70%2Fgravity%2FSouthEast&refer=http%3A%2F%2Fblog.csdn.net%2Fstr999_cn%2Farticle%2Fdetails%2F35223509

'$$'(仅仅限于Results和Conditions中使用),等价于罗列出依次在Head部分匹配的所有变量'$1','$1','$1'等,示例参见上图。这个主要用于我们只对查询结果的部分字段感兴趣的时候用,不需要把整条记录都选择出来。

'$_'(仅仅限于Results和Conditions中使用),表示与查询条件相匹配的整条记录,示例:

test.jsp?url=http%3A%2F%2Fimg.blog.csdn.net%2F20140627164240140%3Fwatermark%2F2%2Ftext%2FaHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3RyOTk5X2Nu%2Ffont%2F5a6L5L2T%2Ffontsize%2F400%2Ffill%2FI0JBQkFCMA%3D%3D%2Fdissolve%2F70%2Fgravity%2FSouthEast&refer=http%3A%2F%2Fblog.csdn.net%2Fstr999_cn%2Farticle%2Fdetails%2F35223509

6、使用查询列表速构(QLC)

QLC的全称是Query List Comprehension。表面看,它类似于普通的列表速构,使用时,又必须嵌套于外观类似于函数调用的qlc:q()中使用。实际上外层的qlc:q(...)只是一个标记,用于让编译器区别对待其中的表达式。要启用该功能,模块源码中必须加上下面这一行:

-include_lib("stdlib/include/qlc.hrl").

但作为特例,可以直接在Erlang shell中使用qlc:q(...)。也可以在事务中使用QLC,任何可以在事务中使用的Mnesia函数都可以与QLC混合使用。

示例:

test.jsp?url=http%3A%2F%2Fimg.blog.csdn.net%2F20140628124851265%3Fwatermark%2F2%2Ftext%2FaHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3RyOTk5X2Nu%2Ffont%2F5a6L5L2T%2Ffontsize%2F400%2Ffill%2FI0JBQkFCMA%3D%3D%2Fdissolve%2F70%2Fgravity%2FSouthEast&refer=http%3A%2F%2Fblog.csdn.net%2Fstr999_cn%2Farticle%2Fdetails%2F35223509

上图是仅仅获取users表中的acc字段。

test.jsp?url=http%3A%2F%2Fimg.blog.csdn.net%2F20140628150312359%3Fwatermark%2F2%2Ftext%2FaHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3RyOTk5X2Nu%2Ffont%2F5a6L5L2T%2Ffontsize%2F400%2Ffill%2FI0JBQkFCMA%3D%3D%2Fdissolve%2F70%2Fgravity%2FSouthEast&refer=http%3A%2F%2Fblog.csdn.net%2Fstr999_cn%2Farticle%2Fdetails%2F35223509

这是获取users表中的整条记录。

有关QLC的更多复杂用法,可以参见Erlang之父Joe Armstrong的新作《Programming Erlang, 2nd》第20章,“Mnesia:The Erlang Database”,326页。其中涉及到比如“2个表联合查询”。

QLC在erl源码中的用法示例:

test.jsp?url=http%3A%2F%2Fimg.blog.csdn.net%2F20140628152312140%3Fwatermark%2F2%2Ftext%2FaHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3RyOTk5X2Nu%2Ffont%2F5a6L5L2T%2Ffontsize%2F400%2Ffill%2FI0JBQkFCMA%3D%3D%2Fdissolve%2F70%2Fgravity%2FSouthEast&refer=http%3A%2F%2Fblog.csdn.net%2Fstr999_cn%2Farticle%2Fdetails%2F35223509

7、删除mnesia:delete

要从数据库删除一行,需要知道该行的对象ID(OID)。对象ID由一个由表名和主键构成的二元组。

示例:

test.jsp?url=http%3A%2F%2Fimg.blog.csdn.net%2F20140628151628500%3Fwatermark%2F2%2Ftext%2FaHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3RyOTk5X2Nu%2Ffont%2F5a6L5L2T%2Ffontsize%2F400%2Ffill%2FI0JBQkFCMA%3D%3D%2Fdissolve%2F70%2Fgravity%2FSouthEast&refer=http%3A%2F%2Fblog.csdn.net%2Fstr999_cn%2Farticle%2Fdetails%2F35223509

8、更新操作

Mnesia数据表里没有UPDATE的概念,如果要修改某条记录,根据表的不同类型,可以先删除,再插入新的记录,或者直接添加新记录代替旧的记录。

9、事务操作

事务代码的结构:

test.jsp?url=http%3A%2F%2Fimg.blog.csdn.net%2F20140628152056296%3Fwatermark%2F2%2Ftext%2FaHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3RyOTk5X2Nu%2Ffont%2F5a6L5L2T%2Ffontsize%2F400%2Ffill%2FI0JBQkFCMA%3D%3D%2Fdissolve%2F70%2Fgravity%2FSouthEast&refer=http%3A%2F%2Fblog.csdn.net%2Fstr999_cn%2Farticle%2Fdetails%2F35223509

f68f2add0b68e4f9810432fce46917b7.png

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值