erlang mnesia 数据库实现SQL查询
Mnesia是一个分布式数据库管理系统,适合于电信和其它需要持续运行和具备软实时特性的Erlang应用,越来越受关注和使用,但是目前Mnesia资料却不多,很多都只有官方的用户指南。下面的内容将着重说明 Mnesia 数据库如何实现SQL查询,实现select / insert / update / where / order by / join / limit / delete等SQL操作。
示例中表结构的定义:
- %% 账号表结构
- -record( y_account,{ id, account, password }).
- %% 资料表结构
- -record( y_info, { id, nickname, birthday, sex }).
1、Create Table / Delete Table 操作
- %%===============================================
- %% create table y_account ( id int, account varchar(50),
- %% password varchar(50), primary key(id)) ;
- %%===============================================
- %% 使用 mnesia:create_table
- mnesia:create_table( y_account,[{attributes, record_info(fields, y_account)} ,
- {type,set}, {disc_copies, [node()]} ]).
- %%===============================================
- %% drop table y_account;
- %%===============================================
- %% 使用 mnesia:delete_table
- mnesia:delete_table(y_account) .
注:参数意义可以看文档,{type,set} 表示id作为主键,不允许id重复,如果改为 {type,bag},id可以重复,但整条记录不能重复
2、Select 查询
查询全部记录
- %%===============================================
- %% select * from y_account
- %%===============================================
- %% 使用 mnesia:select
- F = fun() ->
- MatchHead = #y_account{ _ = '_' },
- Guard = [],
- Result = ['$_'],
- mnesia:select(y_account, [{MatchHead, Guard, Result}])
- end,
- mnesia:transaction(F).
- %% 使用 qlc
- F = fun() ->
- Q = qlc:q([E || E <- mnesia:table(y_account)]),
- qlc:e(Q)
- end,
- mnesia:transaction(F).
查询部分字段的记录
- %%===============================================
- %% select id,account from y_account
- %%===============================================
- %% 使用 mnesia:select
- F = fun() ->
- MatchHead = #y_account{id = '$1', account = '$2', _ = '_' },
- Guard = [],
- Result = ['$$'],
- mnesia:select(y_account, [{MatchHead, Guard, Result}])
- end,
- mnesia:transaction(F).
- %% 使用 qlc
- F = fun() ->
- Q = qlc:q([[E#y_account.id, E#y_account.account] || E <- mnesia:table(y_account)]),
- qlc:e(Q)
- end,
- mnesia:transaction(F).
3、Insert / Update 操作
mnesia是根据主键去更新记录的,如果主键不存在则插入
- %%===============================================
- %% insert into y_account (id,account,password) values(5,"xiaohong","123")
- %% on duplicate key update account="xiaohong",password="123";
- %%===============================================
- %% 使用 mnesia:write
- F = fun() ->
- Acc = #y_account{id = 5, account="xiaohong", password="123"},
- mnesia:write(Acc)
- end,
- mnesia:transaction(F).
4、Where 查询
- %%===============================================
- %% select account from y_account where id>5
- %%===============================================
- %% 使用 mnesia:select
- F = fun() ->
- MatchHead = #y_account{id = '$1', account = '$2', _ = '_' },
- Guard = [{'>', '$1', 5}],
- Result = ['$2'],
- mnesia:select(y_account, [{MatchHead, Guard, Result}])
- end,
- mnesia:transaction(F).
- %% 使用 qlc
- F = fun() ->
- Q = qlc:q([E#y_account.account || E <- mnesia:table(y_account), E#y_account.id>5]),
- qlc:e(Q)
- end,
- mnesia:transaction(F).
如果查找主键 key=X 的记录,还可以这样子查询:
- %%===============================================
- %% select * from y_account where id=5
- %%===============================================
- F = fun() ->
- mnesia:read({y_account,5})
- end,
- mnesia:transaction(F).
如果查找非主键 field=X 的记录,可以如下查询:
- %%===============================================
- %% select * from y_account where account='xiaomin'
- %%===============================================
- F = fun() ->
- MatchHead = #y_account{ id = '_', account = "xiaomin", password = '_' },
- Guard = [],
- Result = ['$_'],
- mnesia:select(y_account, [{MatchHead, Guard, Result}])
- end,
- mnesia:transaction(F).
5、Order By 查询
- %%===============================================
- %% select * from y_account order by id asc
- %%===============================================
- %% 使用 qlc
- F = fun() ->
- Q = qlc:q([E || E <- mnesia:table(y_account)]),
- qlc:e(qlc:keysort(2, Q, [{order, ascending}]))
- end,
- mnesia:transaction(F).
- %% 使用 qlc 的第二种写法
- F = fun() ->
- Q = qlc:q([E || E <- mnesia:table(y_account)]),
- Order = fun(A, B) ->
- B#y_account.id > A#y_account.id
- end,
- qlc:e(qlc:sort(Q, [{order, Order}]))
- end,
- mnesia:transaction(F).
6、Join 关联表查询
- %%===============================================
- %% select y_info.* from y_account join y_info on (y_account.id = y_info.id)
- %% where y_account.account = 'xiaomin'
- %%===============================================
- %% 使用 qlc
- F = fun() ->
- Q = qlc:q([Y || X <- mnesia:table(y_account),
- X#y_account.account =:= "xiaomin",
- Y <- mnesia:table(y_info),
- X#y_account.id =:= Y#y_info.id
- ]),
- qlc:e(Q)
- end,
- mnesia:transaction(F).
7、Limit 查询
- %%===============================================
- %% select * from y_account limit 2
- %%===============================================
- %% 使用 mnesia:select
- F = fun() ->
- MatchHead = #y_account{ _ = '_' },
- mnesia:select(y_account, [{MatchHead, [], ['$_']}], 2, none)
- end,
- mnesia:transaction(F).
- %% 使用 qlc
- F = fun() ->
- Q = qlc:q([E || E <- mnesia:table(y_account)]),
- QC = qlc:cursor(Q),
- qlc:next_answers(QC, 2)
- end,
- mnesia:transaction(F).
8、Select count(*) 查询
- %%===============================================
- %% select count(*) from y_account
- %%===============================================
- %% 使用 mnesia:table_info
- F = fun() ->
- mnesia:table_info(y_account, size)
- end,
- mnesia:transaction(F).
9、Delete 查询
- %%===============================================
- %% delete from y_account where id=5
- %%===============================================
- %% 使用 mnesia:delete
- F = fun() ->
- mnesia:delete({y_account, 5})
- end,
- mnesia:transaction(F).
注:使用qlc模块查询,需要在文件顶部声明“-include_lib("stdlib/include/qlc.hrl").”,否则编译时会产生“Warning: qlc:q/1 called, but "qlc.hrl" not included”的警告。
更新说明:
2013/11/20 补充了 mnesia:select 方式的 limit 查询
erlang mnesia 数据库实现SQL查询的更多相关文章
- oracle数据库元数据SQL查询
oracle数据库经典SQL查询 .查看表空间的名称及大小 select t.tablespace_name, round(sum(bytes/(1024*1024)),0) ts_size from ...
- erlang mnesia 数据库查询
Mnesia是一个分布式数据库管理系统,适合于电信和其它需要持续运行和具备软实时特性的Erlang应用,越来越受关注和使用,但是目前Mnesia资料却不多,很多都只有官方的用户指南.下面的内容将着重说 ...
- erlang mnesia数据库设置主键自增
Mnesia是erlang/otp自带的分布式数据库管理系统.mnesia配合erlang的实现近乎理想,但在实际使用当中差强人意,总会有一些不足.mnesia数据表没有主键自增的功能,但在mnesi ...
- erlang mnesia数据库简单应用
mnesia是erlang自带的分布式数据库,基于ets和dets实现的.mnesia兼顾了dets的持久性和ets的高性能,可以自动在多个erlang节点间同步数据库.最关键的是,mnesia实现了 ...
- Python全栈 MySQL 数据库 (SQL查询、备份、恢复、授权)
ParisGabriel 每天坚持手写 一天一篇 决定坚持几年 为了梦想为了信仰 开局一张图 今天接着昨天的说 索引有4种: 普通 索引 :ind ...
- Android adb使用sqlite3对一个数据库进行sql查询
sqlite是Android下集成的一个轻量级数据库,我们可以通过adb程序进入数据库命令行,对数据进行查询,具体操作如下: ①打开windows的cmd ②输入adb shell.此时进入了该安卓系 ...
- 在数据库中sql查询很快,但在程序中查询较慢的解决方法
在写java的时候,有一个方法查询速度比其他方法慢很多,但在数据库查询很快,原来是因为程序中使用参数化查询时参数类型错误的原因 select * from TransactionNo, fmis_Ac ...
- [转载]Oracle数据库基础--SQL查询经典例题
Oracle基础练习题,采用Oracle数据库自带的表,适合初学者,其中包括了一些简单的查询,已经具有Oracle自身特点的单行函数的应用 本文使用的实例表结构与表的数据如下: emp员工表结构如下: ...
- Oracle数据库基础--SQL查询经典例题
Oracle基础练习题,采用Oracle数据库自带的表,适合初学者,其中包括了一些简单的查询,已经具有Oracle自身特点的单行函数的应用 本文使用的实例表结构与表的数据如下: emp员工表结构如下: ...
随机推荐
- Cocos-x 3.2:从C++过渡到Lua(转载)
原文总结的非常好,都是我们学cocos2d-x以来摸索过的东西,如果早有这篇文章就能少走不少弯路了,特此截屏保存.原文链接:http://shahdza.blog.51cto.com/2410787/ ...
- C# 读XML文件
/// <summary> /// xml文件路径+名称 /// </summary> public void ReadXml(string xmlname) { try { ...
- java小提示:标示符常见命名规则、常用ASCII
标示符常见命名规则: A:包:全部小写B:类或者接口:首字母大写:StudentC:方法或者接口:首字母小写,第二个单词开始开始,每个单词首字母大写:studentAgeD:常量:全部大写,多个单词之 ...
- WCF获取客户端IP和端口
//提供方法执行的上下文环境 OperationContext context = OperationContext.Current; //获取传进的消息属性 MessageProperties pr ...
- Why are very few schools involved in deep learning research? Why are they still hooked on to Bayesian methods?
Why are very few schools involved in deep learning research? Why are they still hooked on to Bayesia ...
- asp网站通用后台代码设计
main2.css: a:link {color: #333333; text-decoration: none}a:visited {color: #000000; text-decoration: ...
- PHP获取APP客户端的IP地址的方法
分析php获取客户端ip 用php能获取客户端ip,这个大家都知道,代码如下: /** * 获取客户端ip * @param number $type * @return string */ func ...
- 关于用 MySQL 存储 Emoji
http://www.v2ex.com/t/137724 如果你希望让你的网站或者 App 支持 Emoji,那么在初次设置 MySQL 时,有一些细节你需要知道. Emoji Emoji 字符的特殊 ...
- eclipse代码自动提示功能设置
一 般默认情况下,Eclipse ,MyEclipse的代码提示功能是比Microsoft Visual Studio的差很多的,主要是Eclipse ,MyEclipse本身有很多选项是默认关闭的, ...
- 【BZOJ 2300】 2300: [HAOI2011]防线修建 (动态凸包+set)
2300: [HAOI2011]防线修建 Description 近来A国和B国的矛盾激化,为了预防不测,A国准备修建一条长长的防线,当然修建防线的话,肯定要把需要保护的城市修在防线内部了.可是A国上 ...