PostgreSql 的 RETURNING 一个使用经验
2016-07-13 00:00
555 查看
摘要: 每日自增号码生成的一个方案(亲测可用)
PostgreSql 的 RETURNING 是在insert 和update操作的时候 可以制定需要的返回。
具体手册:http://www.postgres.cn/docs/9.4/sql-insert.html
我的需求是生成一个有规则的内部订单号,规则为 (字符+日期+6位数字),其中数字每天都从000001开始自增。
对于一个精简主义的人来说,这个逻辑如果用java代码写感觉不太爽,同时要考虑并发的问题。
RETURNING帮了一个大忙
表结构
针对这个需求我设计了一个四个字段的订单号配置表,同时建立一个组合主键
Mybatis sql
用RETURNING可以直接将满足规则的号码直接生成
java 代码逻辑
逻辑很简单 先更新一次当天的数据,如果返回为null,则表示当天还没有新的数据,则新增一条数据并返回
总结:这样代码看起来比较精简且满足并发,同时可以解决一系列类似规则的号码生成,只要将“firstCode”换一个字符就OK。
优化:可以将java代码部分写成一个存储过程。(暂时未试验)
PostgreSql 的 RETURNING 是在insert 和update操作的时候 可以制定需要的返回。
具体手册:http://www.postgres.cn/docs/9.4/sql-insert.html
我的需求是生成一个有规则的内部订单号,规则为 (字符+日期+6位数字),其中数字每天都从000001开始自增。
对于一个精简主义的人来说,这个逻辑如果用java代码写感觉不太爽,同时要考虑并发的问题。
RETURNING帮了一个大忙
表结构
针对这个需求我设计了一个四个字段的订单号配置表,同时建立一个组合主键
CREATE TABLE t_order_no ( first_code character varying(30) NOT NULL, middle_code date NOT NULL, last_code integer, update_time timestamp without time zone, CONSTRAINT t_order_no_seq_pkey PRIMARY KEY (first_code, middle_code) )
Mybatis sql
用RETURNING可以直接将满足规则的号码直接生成
<select id="updateOrderNo" resultType="String"> UPDATE t_order_no set last_code=last_code+1 ,update_time=now() WHERE middle_code = CURRENT_DATE and first_code = #{firstCode} RETURNING first_code||to_char(middle_code,'YYYYMMDD')||to_char(last_code,'FM000000') as order_no </select> <select id="addOrderNo" resultType="String"> INSERT into t_order_no values (#{firstCode},CURRENT_DATE,#{lastCode},now()) RETURNING first_code||to_char(middle_code,'YYYYMMDD')||to_char(last_code,'FM000000') as order_no </select>
java 代码逻辑
逻辑很简单 先更新一次当天的数据,如果返回为null,则表示当天还没有新的数据,则新增一条数据并返回
public String getOrderNo(String firstCode){ String orderNo = orderNoMapper.updateOrderNo(firstCode, null); if(Strings.isNullOrEmpty(orderNo)){ orderNo = orderNoMapper.addOrderNo(firstCode, null, 1); } return orderNo; }
总结:这样代码看起来比较精简且满足并发,同时可以解决一系列类似规则的号码生成,只要将“firstCode”换一个字符就OK。
优化:可以将java代码部分写成一个存储过程。(暂时未试验)
相关文章推荐
- PostgreSQL新手入门教程
- PostgreSQL教程(十):性能提升技巧
- PostgreSQL教程(二):模式Schema详解
- PostgreSQL教程(十三):数据库管理详解
- 深入解读PostgreSQL中的序列及其相关函数的用法
- PostgreSQL教程(八):索引详解
- PostgreSQL教程(三):表的继承和分区表详解
- 简单介绍Ruby on Rails对PostgreSQL数组类型的支持
- PostgreSQL教程(十九):SQL语言函数
- PostgreSQL教程(四):数据类型详解
- PostgreSql新手必学入门命令小结
- 用一整天的时间安装postgreSQL NTFS权限
- FREEBSD安装POSTGRESQL笔记
- Mac OS上安装PostgreSQL的教程
- PostgreSQL8.3.3安装方法第1/2页
- 深入理解PostgreSQL的MVCC并发处理方式
- PostgreSQL教程(一):数据表详解
- PostgreSQL教程(十二):角色和权限管理介绍
- PostgreSQL教程(五):函数和操作符详解(1)