川娃子 2015-07-01 11:09 采纳率: 50%
浏览 4300
已采纳

sql 按规则生成编号,字母递增

生成规则 HFR+Code+Date
这是生成的主键编号
HFR-xxx-20150101
HFR-xxx-20150104
HFR-xxx-20150109
HFR-xxx-20150111
HFR-xxx-20150112

当Code和Date重复时就在后面加字母区分
HFR-xxx-20150101
HFR-xxx-20150101A
HFR-xxx-20150101B
HFR-xxx-20150101C
HFR-xxx-20150101D
超过26个字母就这样
HFR-xxx-20150101Z
HFR-xxx-20150101ZA
.....
HFR-xxx-20150101ZZA
....
HFR-xxx-20150101ZZZA
如果后面是数据就好办了,但字母就有点难处理了
注意考虑并发情况

  • 写回答

2条回答

  • Tiger_Zhao 2015-07-02 02:54
    关注

    建一个辅助表SubCode(No,Code),内容

        No Code
        -- ----
         0      <-Code为空字符串
         1 A
         2 B
        ...
        26 Z
        27 ZA
        ...
    

    以下为SQL Server的例子

        DECLARE @key varchar(20)
        DECLARE @lastKey varchar(20)
        DECLARE @subCode varchar(4)
        DECLARE @no int
    
        -- 编号前缀
        SET @key = 'HFR-xxx-20150101'
        -- 求最大编号
        SELECT @lastKey = MAX([key]) FROM table1
    
        IF (@lastKey IS NOT NULL)
        BEGIN
            -- 最大子编号
            SET @subCode = SUBSTRING(@lastKey,LEN(@key)+1,4)
            SELECT @no = No FROM SubCode WHERE Code = @subCode
            -- 下个子编号
            SELECT @subCode = Code FROM SubCode WHERE No = @no + 1
            -- 拼接
            SET @key = @key + @subCode
        END
        /*
        ELSE 直接使用编号 @key
        */
    
        -- 并发只能用编号唯一引发错误,重试
        INSERT INTO table1([key],...)
        VALUES(@key,...)
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 Python爬取指定微博话题下的内容,保存为txt
  • ¥15 vue2登录调用后端接口如何实现
  • ¥65 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?