这两天因为需求,需要获取一张表的流水号。规则是这样的。当前日期+8位流水号。比如:2015062400000001,2015062400000002,2015062400000003....
因为考虑到并发问题,所以解决的方案是:在MySQL写存储过程,逻辑如下:
1、查询表今天流水号的最大主键值:如:
SELECT MAX(a.ORDER_ID) from Zhang_Test a where 1=1 and a.order_id LIKE CONCAT('%',nowDate,'%')
其中nowData 是:SELECT date_format(NOW(),'%Y%m%d') from dual 即当前日期,没有任何分隔符;如:20150624
2、判断是否有值,如果有+1。没有则为nowData + 00000001 如:2015062400000001;设置为今天第一个流水号。
3、向表插入数据,这样就把这个流水号占用了。如果有其他程序访问这个存储过程,那么就会在当前的流水号上再加1.
4、返回当前流水号
因为这些都是在存储过程中执行,所以就能有效保证获取的流水号是唯一的。这样就不会造成主键冲突。只是保存数据时,由新增变为了更新,因为获取的流水号在存储过程中就已经插入了一条数据&