Mnesia是一个分布式数据库管理系统,适合于电信和其它需要持续运行和具备软实时特性的Erlang应用,越来越受关注和使用,但是目前Mnesia资料却不多,很多都只有官方的用户指南。下面的内容将着重说明  Mnesia 数据库如何实现SQL查询,实现select / insert / update / where / order by / join / limit / delete等SQL操作。

示例中表结构的定义:

[plain] view plaincopy
  1. %% 账号表结构
  2. -record( y_account,{ id, account, password }).
  3. %% 资料表结构
  4. -record( y_info, { id, nickname, birthday, sex }).

1、Create Table / Delete Table 操作

[plain] view plaincopy
  1. %%===============================================
  2. %%  create table y_account ( id int, account varchar(50),
  3. %%   password varchar(50),  primary key(id)) ;
  4. %%===============================================
  5. %% 使用 mnesia:create_table
  6. mnesia:create_table( y_account,[{attributes, record_info(fields, y_account)} ,
  7. {type,set}, {disc_copies, [node()]} ]).
  8. %%===============================================
  9. %%  drop table y_account;
  10. %%===============================================
  11. %% 使用 mnesia:delete_table
  12. mnesia:delete_table(y_account) .

注:参数意义可以看文档,{type,set} 表示id作为主键,不允许id重复,如果改为 {type,bag},id可以重复,但整条记录不能重复

2、Select 查询

查询全部记录

[plain] view plaincopy
  1. %%===============================================
  2. %%  select * from y_account
  3. %%===============================================
  4. %% 使用 mnesia:select
  5. F = fun() ->
  6. MatchHead = #y_account{ _ = '_' },
  7. Guard = [],
  8. Result = ['$_'],
  9. mnesia:select(y_account, [{MatchHead, Guard, Result}])
  10. end,
  11. mnesia:transaction(F).
  12. %% 使用 qlc
  13. F = fun() ->
  14. Q = qlc:q([E || E <- mnesia:table(y_account)]),
  15. qlc:e(Q)
  16. end,
  17. mnesia:transaction(F).

查询部分字段的记录

[plain] view plaincopy
  1. %%===============================================
  2. %%  select id,account from y_account
  3. %%===============================================
  4. %% 使用 mnesia:select
  5. F = fun() ->
  6. MatchHead = #y_account{id = '$1', account = '$2', _ = '_' },
  7. Guard = [],
  8. Result = ['$$'],
  9. mnesia:select(y_account, [{MatchHead, Guard, Result}])
  10. end,
  11. mnesia:transaction(F).
  12. %% 使用 qlc
  13. F = fun() ->
  14. Q = qlc:q([[E#y_account.id, E#y_account.account] || E <- mnesia:table(y_account)]),
  15. qlc:e(Q)
  16. end,
  17. mnesia:transaction(F).

3、Insert / Update 操作

mnesia是根据主键去更新记录的,如果主键不存在则插入

[plain] view plaincopy
  1. %%===============================================
  2. %%    insert into y_account (id,account,password) values(5,"xiaohong","123")
  3. %%     on duplicate key update account="xiaohong",password="123";
  4. %%===============================================
  5. %% 使用 mnesia:write
  6. F = fun() ->
  7. Acc = #y_account{id = 5, account="xiaohong", password="123"},
  8. mnesia:write(Acc)
  9. end,
  10. mnesia:transaction(F).

4、Where 查询

[plain] view plaincopy
  1. %%===============================================
  2. %%    select account from y_account where id>5
  3. %%===============================================
  4. %% 使用 mnesia:select
  5. F = fun() ->
  6. MatchHead = #y_account{id = '$1', account = '$2', _ = '_' },
  7. Guard = [{'>', '$1', 5}],
  8. Result = ['$2'],
  9. mnesia:select(y_account, [{MatchHead, Guard, Result}])
  10. end,
  11. mnesia:transaction(F).
  12. %% 使用 qlc
  13. F = fun() ->
  14. Q = qlc:q([E#y_account.account || E <- mnesia:table(y_account), E#y_account.id>5]),
  15. qlc:e(Q)
  16. end,
  17. mnesia:transaction(F).

如果查找主键 key=X 的记录,还可以这样子查询:

[plain] view plaincopy
  1. %%===============================================
  2. %%   select * from y_account where id=5
  3. %%===============================================
  4. F = fun() ->
  5. mnesia:read({y_account,5})
  6. end,
  7. mnesia:transaction(F).

如果查找非主键 field=X 的记录,可以如下查询:

[plain] view plaincopy
  1. %%===============================================
  2. %%   select * from y_account where account='xiaomin'
  3. %%===============================================
  4. F = fun() ->
  5. MatchHead = #y_account{ id = '_', account = "xiaomin", password = '_' },
  6. Guard = [],
  7. Result = ['$_'],
  8. mnesia:select(y_account, [{MatchHead, Guard, Result}])
  9. end,
  10. mnesia:transaction(F).

5、Order By 查询

[plain] view plaincopy
  1. %%===============================================
  2. %%   select * from y_account order by id asc
  3. %%===============================================
  4. %% 使用 qlc
  5. F = fun() ->
  6. Q = qlc:q([E || E <- mnesia:table(y_account)]),
  7. qlc:e(qlc:keysort(2, Q, [{order, ascending}]))
  8. end,
  9. mnesia:transaction(F).
  10. %% 使用 qlc 的第二种写法
  11. F = fun() ->
  12. Q = qlc:q([E || E <- mnesia:table(y_account)]),
  13. Order = fun(A, B) ->
  14. B#y_account.id > A#y_account.id
  15. end,
  16. qlc:e(qlc:sort(Q, [{order, Order}]))
  17. end,
  18. mnesia:transaction(F).

6、Join 关联表查询

[plain] view plaincopy
  1. %%===============================================
  2. %%   select y_info.* from y_account join y_info on (y_account.id = y_info.id)
  3. %%      where y_account.account = 'xiaomin'
  4. %%===============================================
  5. %% 使用 qlc
  6. F = fun() ->
  7. Q = qlc:q([Y || X <- mnesia:table(y_account),
  8. X#y_account.account =:= "xiaomin",
  9. Y <- mnesia:table(y_info),
  10. X#y_account.id =:= Y#y_info.id
  11. ]),
  12. qlc:e(Q)
  13. end,
  14. mnesia:transaction(F).

7、Limit 查询

[plain] view plaincopy
  1. %%===============================================
  2. %%   select * from y_account limit 2
  3. %%===============================================
  4. %% 使用 mnesia:select
  5. F = fun() ->
  6. MatchHead = #y_account{ _ = '_' },
  7. mnesia:select(y_account, [{MatchHead, [], ['$_']}], 2, none)
  8. end,
  9. mnesia:transaction(F).
  10. %% 使用 qlc
  11. F = fun() ->
  12. Q = qlc:q([E || E <- mnesia:table(y_account)]),
  13. QC = qlc:cursor(Q),
  14. qlc:next_answers(QC, 2)
  15. end,
  16. mnesia:transaction(F).

8、Select count(*) 查询

[plain] view plaincopy
  1. %%===============================================
  2. %%   select count(*) from y_account
  3. %%===============================================
  4. %% 使用 mnesia:table_info
  5. F = fun() ->
  6. mnesia:table_info(y_account, size)
  7. end,
  8. mnesia:transaction(F).

9、Delete 查询

[plain] view plaincopy
  1. %%===============================================
  2. %%   delete from y_account where id=5
  3. %%===============================================
  4. %% 使用 mnesia:delete
  5. F = fun() ->
  6. mnesia:delete({y_account, 5})
  7. end,
  8. mnesia:transaction(F).

注:使用qlc模块查询,需要在文件顶部声明“-include_lib("stdlib/include/qlc.hrl").”,否则编译时会产生“Warning: qlc:q/1 called, but "qlc.hrl" not included”的警告。

elang mnesia 数据库操作相关推荐

  1. Python的数据库操作(Sqlalchemy)

    ORM 全称 Object Relational Mapping, 翻译过来叫对象关系映射.简单的说,ORM 将数据库中的表与面向对象语言中的类建立了一种对应关系.这样,我们要操作数据库,数据库中的表 ...

  2. 便捷,轻巧的Groovy数据库操作

    本文主要介绍Groovy对数据的CRUD操作,熟悉groovy.sql包,测试使用的数据库是H2. 1.数据库连接配置 //数据库连接配置 def db = [url:'jdbc:h2:mem:gro ...

  3. Django模型之数据库操作-查询

    六.数据库操作-查询 6.1基础条件查询 1 基本查询 get查询单一结果,如果不存在会抛出模型类.DoesNotExist异常. all查询多个结果.[返回的所有结果是列表] count查询结果数量 ...

  4. 命令行客户端MySQL基本命令的使用(登录、登出、数据库操作的SQL语句、表结构的SQL语句、表数据操作的SQL语句)

    1. 登录和登出数据库 登录数据库: 输入下面命令: mysql -uroot -p 说明: -u 后面是登录的用户名  [写成-u root也是可以的] -p 后面是登录密码, 如果不填写, 回车之 ...

  5. .ne中的控制器循环出来的数据如何显示在视图上_Web程序设计-ASP.NET MVC4数据库操作实例...

    ASP.NET MVC4数据库操作实例 之前文章介绍了MVC4与Pure框架结合进行的网页设计过程中如何定义控制器.方法.模型.视图等.并使用实例进行了简单说明.本文将在此基础上进一步说明如何使用MV ...

  6. oracle可以面向对象吗,Jbdc助手-数据库操作面向对象的实现(oracle)

    前言: 如果你对hibernate不是那样的推崇,但感觉jdbc的sqlr操作又不是那么OO的话,那么这篇文章可能给能带来或多或少的期望- 在很长的一段时间里,中总感觉应该对sql的操作来实现一种集成 ...

  7. yii mysql数据库操作_Yii2数据库操作常用方法小结

    本文实例讲述了Yii2数据库操作常用方法.分享给大家供大家参考,具体如下: 查询: // find the customers whose primary key value is 10 $custo ...

  8. mfc 访问局域网mysql_数据库操作:MFC连接与MYSQL

    数据库操作:MFC连接与MYSQL mysql 与MFC通常情况下都是用ODBC或者是是ADO相连接,但有点伤 我直接找网上的教程,仿照着进行连接,试了n边还是只能连接上,但无法进行如图读取,写入的操 ...

  9. 数据库操作(使用FMDB)

    iOS中原生的SQLite API在使用上相当不友好,在使用时,非常不便.于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.PlausibleDatabase.sqlitepers ...

最新文章

  1. oracle卸载注意啥,关于oracle的安装,卸载以及其他注意事项
  2. HDOJ/HDU 2565 放大的X(分段思考~)
  3. Atlas元数据存储模型分析
  4. pb中将已经建好的Grid类型转为Tabular类型
  5. Pocket通证POKT锁仓总价值超2.1947亿美元
  6. The Nth Item
  7. 开课吧:Web前端开发三大框架的特点
  8. OpenGL与shader区别(三十一)
  9. windowsGHO镜像系统winXPwin7win8win10下载
  10. bootstrap模板免费下载
  11. 图像尺寸与图像像素、分辨率的关系
  12. UnityShader源码2017---学习笔记与自我拓展001
  13. Google浏览器任务栏图标变白
  14. 鼠标双击DataGridView单元格变成ComboBox
  15. 学习ArrayList 和 LinkedList小记【2】
  16. API系列(一):SMS API
  17. Windows10共享CentOS文件系统(Samba的使用)
  18. 基于android 平台的校园二手物品交易系统设计与实现
  19. CSS技巧之向下箭头
  20. 安装linux系统安装心得,安装操作系统的心得体会

热门文章

  1. [leetcode]Unique Paths II
  2. Android App性能优化总结
  3. b站路飞学城python课梨视频项目代码
  4. Asciinema终端SSH录屏神器使用
  5. [Linux From Scratch 作一个自己的Linux操作系统发行版本]一、环境准备
  6. 永久60服务器消息,魔兽世界怀旧服:永久60级已经成为了另一个游戏,这如你所愿吗?...
  7. vue验证手机号、密码验证码、时间、机型、图片类型等
  8. 鸿蒙系统安装苹果电脑,好消息!华为鸿蒙OS系统,解决了苹果、安卓系统的一大难题...
  9. 实验室预约管理系统大型仪器预约平台
  10. chrome浏览器无法找到 www.baidu.com 的 DNS 地址