文档章节

PostgreSql 的 RETURNING 一个使用经验

G_exe
 G_exe
发布于 2016/07/13 20:00
字数 418
阅读 3.7K
收藏 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
码字总数 2203
作品 0
长沙
程序员
私信 提问
加载中

评论(0)

PostgreSQL merge insert(upsert/insert into on conflict) 如何区分数据是INSERT还是UPDATE

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

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

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

MrQ被抢注了
2018/05/23
0
0
PostgreSQL深圳用户分会

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

YuanyuanL
2015/08/10
143
0
PostgreSQL用户应掌握的高级SQL特性(有书送)

作者介绍 谭峰,网名francs,中国开源软件推进联盟PostgreSQL分会特聘专家,《PostgreSQL实战》作者之一,《PostgreSQL 9 Administration Cookbook》译者之一。现就职于浙江移动负责应用上云...

DBAplus社群
2018/08/21
0
0
新书推荐 |《PostgreSQL实战》出版

很高兴《PostgreSQL实战》一书终于出版,本书大体上系统总结了笔者 PostgreSQL DBA 职业生涯的经验总结,本书的另一位作者张文升拥有丰富的PostgreSQL运维经验,目前就职于探探科技任首席Pos...

francs.tan
2018/08/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

kafka重要概念与集群重点配置详解

重要概念 broker 一个broker就是一个kafka实例,负责接收、转发、存储消息,kafka集群就是由多个broker组成。 topic kafka的topic是一个逻辑概念,就是对消息分组、分类,便于区分处理不同业...

trayvon
今天
44
0
在树莓派里搭建 Lighttpd 服务器

Lighttpd 像 Ngnix 一样,是被设计运行在低内存,低 CPU 负载的设备上,它们都非常适合在树莓派上运行。 本文将介绍如何在树莓派上运行基本配置的 Lighttpd ,以及如何与 PHP-FRM 一起使用。...

良许Linux
今天
21
0
Service Mesh 高可用在企业级生产中的实践 | 线上直播回顾

Service Mesh Virtual Meetup 是 ServiceMesher 社区和 CNCF 联合主办的线上系列直播。本期为 Service Mesh Virtual Meetup#1 ,邀请了四位来自不同公司的嘉宾,从不同角度展开了 Service Me...

SOFAStack
今天
37
0
word转pdf软件有哪些?word转pdf软件怎么操作?

虽说日常生活中,很多人写报告写策划都依然会使用word程序,但是严格来说,word却并非是唯一常用的办公软件,就比如说pdf,就越来越受年轻人的欢迎了,那么经常用电脑办公的你是否知道,其实...

开源86
今天
48
0
Java创建对象的过程(类实例化)

1.检查类是否被加载。 当虚拟机遇到new指令后,会先去常量池检查有没有该类的符号引用,并且检查这个类有没有进行加载、解析、初始化过,没有就先执行类加载过程。 2.为对象分配内存空间*。 ...

曦鱼violet
今天
26
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部