PostgreSql 的 RETURNING 一个使用经验
博客专区 > G_exe 的博客 > 博客详情
PostgreSql 的 RETURNING 一个使用经验
G_exe 发表于1年前
PostgreSql 的 RETURNING 一个使用经验
  • 发表于 1年前
  • 阅读 24
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

摘要: 每日自增号码生成的一个方案(亲测可用)

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代码部分写成一个存储过程。(暂时未试验)
共有 人打赏支持
粉丝 4
博文 7
码字总数 2107
×
G_exe
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: