需求1:订单号要求唯一、长度不太长、自增、但不能通过早上订单号和晚上订单号相减推算出平台大概一天的单量

需求2:要求生成10w张优惠券,要求券码唯一、不能太长,不能轻易猜测出其他券码

根据这些需求提供一个简单的数据库发号的sql来满足上面的需求,介绍如下

Increments表设计两个字段,Prefix和MaxNum,不需要设计主键和聚集索引,在Prefix上建立唯一索引,可Include[MaxNum]字段,这样查询时可以保证索引覆盖

将前缀和数据拼接的服务由应用来提供,数据库自负责拿到增加后的数字,建议封装成存储过程,切记此脚本本身已包含事务,不要在应用程序中再使用事务嵌套(另外本人非dba,技术水平有限,不能保证下面sql不会出现死锁)

DECLARE @Prefix nvarchar(32)='C' --输入前缀
DECLARE @SetpSize int=1 --输入增长步长
SET TRANSACTION ISOLATION LEVEL READ COMMITTED --设置隔离级别
BEGIN TRAN --开启事务
DECLARE @maxNum bigint=0 --声明目前指定前缀的当前最大数字
reTry: --goto的label
SELECT
@maxNum = MaxNum + @SetpSize
FROM Increments WITH (UPDLOCK)
WHERE Prefix = @Prefix --使用更新锁查询指定前缀的目前种子数+步长,并发时,如果存在记录,只有一个连接可以查询到此记录,其他连接会被阻塞至事务提交后
IF (@maxNum = 0) --如果未查到此前缀
BEGIN
BEGIN TRY
SET @maxNum = @maxNum + @StepSize
INSERT Increments
VALUES (@Prefix, @maxNum) --插入前缀记录,设置目前种子数等于步长,并发情况下同样的前缀可能会同时会执行插入操作,通过在Prefix设置唯一索引使只有一个插入成功,其他重新reTry
END TRY
BEGIN CATCH
GOTO reTry --插入失败时reTry
END CATCH
END
ELSE
BEGIN
UPDATE Increments
SET MaxNum = MaxNum + @StepSize
WHERE Prefix = @Prefix --查到种子数的情况下,更新记录
END
SELECT
@maxNum --返回目前种子数+步长的结果
COMMIT

订单号:短日期作为前缀+随机(1-9)步长+随机数字,如

20180108 00016 037 --示例,正常情况中间没有空格
20180108 00019 233

券码:批量生成10w张,单字母作为前缀(如T),步长设置为100W,获取数字(如2000000),生成1000000-2000000的数组,通过洗牌算法获取10w个元素,将每个元素转换为36进制

TSM9H   --对应T1335221
TSMC9 --对应T1335321

然后类似身份证校验码,自己设计一个算法增加1-2位校验码在开始或者结束,如所有数字*自身相加取最后一位放在最后,例

--T转换为数字为29

TSM9H8  --对应TSM9H 2*2+9*9+1*1+3*3+3*3+5*5+2*2+2*2+1*1=138
TSMC93 --对应TSMC9 2*2+9*9+1*1+3*3+3*3+5*5+3*3+2*2+1*1=143

简易发号SQL,可用于生成指定前缀自增序列,如订单号,生成优惠券码等的更多相关文章

  1. 简易发号SQL,可用于生成指定前缀自增序列--改进版

    使用merge语法实现新增or更新 首先创建表 CREATE TABLE Test.dbo.Increments ( Prefix varchar(50) NOT NULL, [MaxNum ] bi ...

  2. php生成唯一id/唯一标识符/唯一订单号

    /** * php 生成唯一id * https://blog.csdn.net/hzqghost/article/details/18914681 */ function guid($factor= ...

  3. 全局唯一订单号生成方法(参考snowflake)

    backgroud Snowflake is a network service for generating unique ID numbers at high scale with some si ...

  4. pidof---查找指定名称的进程的进程号id号。

    pidof命令用于查找指定名称的进程的进程号id号. 语法 pidof(选项)(参数) 选项 -s:仅返回一个进程号: -c:仅显示具有相同“root”目录的进程: -x:显示由脚本开启的进程: -o ...

  5. ASP.NET微信公众号用于给指定OpenId用户发送红包

    ASP.NET微信公众号用于给指定OpenId用户发送红包 微信公众号要实现对指定用户发送红包,必须指定一个存放兵发放金额的商户号,在微信商户平台里面申请商户号并获取相关参数例如发送红包所要用到的安全 ...

  6. 高并发分布式系统中生成全局唯一(订单号)Id js返回上一页并刷新、返回上一页、自动刷新页面 父页面操作嵌套iframe子页面的HTML标签元素 .net判断System.Data.DataRow中是否包含某列 .Net使用system.Security.Cryptography.RNGCryptoServiceProvider类与System.Random类生成随机数

    高并发分布式系统中生成全局唯一(订单号)Id   1.GUID数据因毫无规律可言造成索引效率低下,影响了系统的性能,那么通过组合的方式,保留GUID的10个字节,用另6个字节表示GUID生成的时间(D ...

  7. Oracle 生成指定范围内随机日期

    Oracle生成一个指定范围内的随机日期 /* 年1月1日)的整数偏移量来保存(即把日期保存为一个数字); * 因此可通过寻找‘指定日期’与‘关键日期’相对应的整数偏移量,再加一个指定范围内的随机整数 ...

  8. linux生成指定大小的文件(转)

    # dd if=/dev/zero of=50M.file bs=1M count=50在当前目录下生成一个50M的文件 虚拟块设备文件更通用的名称是硬盘镜像文件(Hard Disk Image),但 ...

  9. MSSQL高并发下生成连续不重复的订单号

    一.确定需求 只要做过开发的基本上都有做过订单,只要做过订单的基本上都要涉及生成订单号,可能项目订单号生成规则都不一样,但是大多数规则都是连续增长. 所以假如给你一个这样的需求,在高并发下,以天为单位 ...

随机推荐

  1. Codeforces 903D Almost Difference

    Codeforces 903D Almost Difference time limit per test 2 seconds memory limit per test 256 megabytes ...

  2. 【margin和padding的区别】

    margin和padding的区别 margin是指从自身边框到另一个容器边框之间的距离,就是容器外距离.(外边距) padding是指自身边框到自身内部另一个容器边框之间的距离,就是容器内距离.(内 ...

  3. 线性表的顺序存储结构的实现及其应用(C/C++实现)

    存档--- #include <stdio.h> #include <stdlib.h> typedef int ElemType; #define MAXSIZE 10 #i ...

  4. 2017广东工业大学程序设计竞赛决赛 题解&源码(A,数学解方程,B,贪心博弈,C,递归,D,水,E,贪心,面试题,F,贪心,枚举,LCA,G,dp,记忆化搜索,H,思维题)

    心得: 这比赛真的是不要不要的,pending了一下午,也不知道对错,直接做过去就是了,也没有管太多! Problem A: 两只老虎 Description 来,我们先来放松下,听听儿歌,一起“唱” ...

  5. string::npos的一些说明

    一.定义 std:: string ::npos的定义: static const size_t npos = -1; 表示 size_t 的最大值( Maximum value for size_t ...

  6. 在R12下加载Java Bean,配置FORMS_WEB_CONFIG_FILE文件/通过AutoConfig实现Form Server配置文件的修改

    1.定位模版文件$AD_TOP/bin/adtmplreport.sh contextfile=$CONTEXT_FILE target=$FORMS_WEB_CONFIG_FILE以上命令,通过查看 ...

  7. linux管理面板

    小编在这儿给大家介绍几款linux管理面板,希望感兴趣的童鞋可以去尝试下.个人觉得宝塔和appnode这两个面板不仅从功能和样式都还是做的比较好的,但是部分功能是收费的,但是webmin绝对是一款免费 ...

  8. Effective Java 第三版——23. 优先使用类层次而不是标签类

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  9. c++工程重复编译与重复定义

    #ifndef #define #endif防止的是"重复编译",而不是"重复定义"重复编译可能造成重复定义,但重复定义的来源不只有重复编译从代码变成可执行的程 ...

  10. Linux中安装opencv-3.3.1

    在ubuntu16.04中安装opencv3.3.1的过程中踩了许多坑.一开始直接安装还挺顺利但运行程序时总是提示libgtk2.0-dev和pkg-config没有安装,在安装这两个包的过程中也不顺 ...