博客http://www.cnblogs.com/haoxinyue/p/5208136.html中详细介绍了各算法及其优缺点,这里说一种比较简单的,有点类似文章中的snowflake算法,id组成为:标识符+年月日+序号,例如15位id表示为:“A20171102000001”,用一张表记录当前要生成id的业务的序号,表名:date_sequence,字段主要有三个:code,produce_date,num,code用来标识哪个业务模块的id,num表示该id目前的序号为多少,没产生一次id,该序号加一,这个表使用code和produce_date作为联合主键。此时的sql语句可以使用merge实现
<select id="getNextSequence" resultMap="BaseResultMap">
merge into date_sequence as dest
using (values(#{code},convert(varchar(8),getdate(),112),1)) as src (code, producedate, num)
on src.code = dest.code and src.producedate = dest.producedate
when matched then update set dest.num= dest.num + 1
when not matched then insert (code, producedate, num) values (src.code, src.producedate,src.num)
output inserted.Code,inserted.produceDate,inserted.num;
</select>
不足之处:从示例”A20171102000001”可以看出,每天只能产生999999条id,当业务量大时可能不满足需求,可以增加序号的位数,或者根据链接中的其他算法产生。