文档章节

PostgreSql 的 RETURNING 一个使用经验

G_exe
 G_exe
发布于 2016/07/13 20:00
字数 418
阅读 35
收藏 0

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代码部分写成一个存储过程。(暂时未试验)

© 著作权归作者所有

共有 人打赏支持
G_exe
粉丝 3
博文 16
码字总数 2170
作品 0
长沙
程序员
私信 提问
PostgreSQL merge insert(upsert/insert into on conflict) 如何区分数据是INSERT还是UPDATE

背景 使用insert into on conflict update语法,可以支持UPSERT的功能,但是到底这条SQL是插入的还是更新的呢?如何判断 通过xmax字段的值是否不为0,可以判断,如果是UPDATE,XMAX里面会填充...

pg小助手
10/19
0
0
写一个“特殊”的查询构造器 - (七、DML 语句、事务)

查询语句 (DQL) 的构造功能开发完毕,我们再给查询构造器增加一些对 DML (Data Manipulation Language) 语句的支持,如简单的 insert、update、delete 操作。 insert 我们先回顾下 PDO 原生的...

MrQ被抢注了
05/23
0
0
PostgreSQL 11 preview - 通用场景性能 增强 汇总

标签 PostgreSQL , 通用场景性能 , 增强 , 11 背景 PostgreSQL 11 通用场景性能增强。 E.1.3.1.5. General Performance Add Just-In-Time (JIT) compilation of some parts of query plans t......

德哥
07/28
0
0
PostgreSQL深圳用户分会

主题: PG逻辑复制BDR、PGXC、PG RDS 主办: Postgres深圳用户会201501会(40人规模) 微信公众号:PostgresChina 官网:postgres.cn 承办:Postgres深圳分会 费用:免费(特别感谢宝华提供会议场...

YuanyuanL
2015/08/10
68
0
PostgreSQL 用 CTE语法 + 继承 实现拆分大表

背景 业务设计初期可能不会考虑到表将来会有多大,或者由于数据日积月累,单表会变得越来越大。 后面在考虑分区的话,应该怎么将单表切换成分区表呢? 这里可以用到PostgreSQL的CTE语法,以及...

流浪的猫666
07/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

读取zookeeper上的dubbo注册信息

dubbo有自己的服务监听服务器,incubator-dubbo-ops-develop,github可以下载到,网上也有很多本地部署的例子,就想了下能不能自己监听dubbo的服务,于是写了如下代码。特别注意的是zookeep...

noob_chr
20分钟前
0
0
Java提高班(六)反射和动态代理(JDK Proxy和Cglib)

反射和动态代理放有一定的相关性,但单纯的说动态代理是由反射机制实现的,其实是不够全面不准确的,动态代理是一种功能行为,而它的实现方法有很多。要怎么理解以上这句话,请看下文。 一、...

王磊的博客
39分钟前
2
0
Ext grid 渲染

// 单元格字体颜色渲染function renderer_Meta_useStatus(value, cellmeta, record,rowIndex, columnIndex, store){ var color = ""; if("空闲"==value){ color = "green";......

MoksMo
49分钟前
5
0
log4j2在spring中的配置

<?xml version="1.0" encoding="UTF-8"?><!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL --><!--Configuration后面的status,这个用于设置l......

TonyTaotao
55分钟前
4
0
java 中间变量缓存机制(i++,++i)

public class Test { public static void main(String[] args) { int i = 0; i = i ++ ; System.out.println(i); } } 答案是 0 如果是 i = ++......

shzwork
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部