zoukankan      html  css  js  c++  java
  • 数据库自增字段是字符型的简单处理

    在做数据库练习的时候,遇到一个问题,是以前从未接触但是看过人家实现的问题:
    描述1:学号总共 12 位,由字母 XH+年+6 位数字编号组成(如 XH2014000001), 必
    须唯一, 在新增时自动生成,数字编号自动增长
    问题:数据库中自增的都是int型,变成字符串该怎么办呢?因为在数据库端实现自增,不能在软件端处理了。在不考虑
    几个函数的解释:
    Right(str,len)-字段返回最右边的len个字符的字符串str
    MAX()-字段中最大的值
    IsNull() 如为空就为空
    思路:

    首先这是个自定义函数
    前面的XH固定
    年为YEAR(GETDATE())
    查找表中该列中的最大值取到后(右)6位,最大的+1

     

    create function f_GetStudentGuid()
    returns varchar(12)
    as
    begin
    declare @studentGuid varchar(12)
    select @studentGuid='XH'+CONVERT(varchar,YEAR(GETDATE()))+RIGHT(1000000+ISNULL(RIGHT(MAX(studentGuid),6),0)+1,6)
    from StudentInfo
    return @studentGuid
    end
    ---------------------


    --为表添加 默认值

    ALTER TABLE studentinfo ADD DEFAULT ([dbo].[f_GetStudentGuid]()) FOR StudentGuid
    GO 


    --也可以在图形化界面输入[dbo].[f_GetStudentGuid]()
    下面通过输入数据获取以下信息

     

    图1


    好了,现在我仿照上面的做法来完成以下几个案例。
    案例1:成绩记录 Guid 总共 15 位,由字母 CJ+年月日 +数字编号 组成(如CJ2013090700001),必须唯一,在新增时自动生成,数字编号自动增长。
    那么,下面我就来写这个函数
    -----------------------------

    ------------------------------

    create function f_GetScoreGuid()
    returns varchar(15)
    as
    begin
    declare @ScoreGuid varchar(15)
    declare @time varchar(8)
    set @time=CONVERT(varchar,YEAR(GETDATE()))+RIGHT('00'+CONVERT(varchar,month(getdate())),2)+CONVERT(varchar,DAY(GETDATE()))
    select @ScoreGuid='CJ'+@time+RIGHT(100000+ISNULL(RIGHT(MAX(ScoreGuid),5),0)+1,5)
    from ScoreInfo
    return @ScoreGuid
    end

    说明:获取时间,注意剩余的位数

    注意:月份的获取

    RIGHT('00'+CONVERT(varchar,month(getdate())),2)


    测试

     


    图2

     

     

    为了巩固练习,我们继续来完成几个案例
    案例2:员工编号总共 6 位,由字母 YG+4 位数字编号组成(如 YG0001),必须唯一,在新增时自动生成,数字编号自动增长。
    这个案例只要把时间去掉,减少编号的位数即可

    你也来做一个练习吧!

    案例3:工资记录 ID 总共 12 位,由字母 GZ+年月+4 位数字编号组成(如 GZ2015040001),
    必须唯一,在新增时自动生成,数字编号自动增长。
    总结:
    1 函数的写法。
    2 表 字段对应好
    3 如何设置默认值
    4 以后可能会接触更加复杂的流水号,这里的方法可能就不适合了。就当一个简单的思维练习吧。

     

    create function f_GetCourseID()
    returns varchar(6)
    as
    begin
    declare @ID varchar(6)
    select @ID='KC'+RIGHT(10000+ISNULL(RIGHT(MAX(ID),4),0)+1,4)
    from CourseInfo
    return @ID
    end
    
    ALTER TABLE CourseInfo ADD DEFAULT ([dbo].[f_GetCourseID]()) FOR StudentGuid
    GO 
    
    
    -------------------------------------------------------
    create function f_GetSalaryID()
    returns varchar(12)
    as
    begin
    declare @SalaryID varchar(12)
    declare @time varchar(6)
    set @time=CONVERT(varchar,YEAR(GETDATE()))+RIGHT('00'+CONVERT(varchar,month(getdate())),2)
    select @SalaryID='XK'+@time+RIGHT(10000+ISNULL(RIGHT(MAX(SalaryID),4),0)+1,4)
    from SubscribedInfo
    return @SalaryID
    end
    ALTER TABLE SubscribedInfo ADD DEFAULT ([dbo].[f_GetSalaryID]()) FOR SalaryID
    GO 

     以上的方法即可满足一般需要。当面对复杂的流水号问题时候,可能会用到新的方法,等到我遇到的时候再研究研究。

    记录下。

  • 相关阅读:
    Python 爬虫js加密破解(一) 爬取今日头条as cp 算法 解密
    Python 爬虫实例(2)—— 爬取今日头条
    Python 爬虫实例(1)—— 爬取百度图片
    python 操作redis之——HyperLogLog (八)
    python 操作redis之——有序集合(sorted set) (七)
    Python操作redis系列之 列表(list) (五)
    Python操作redis系列以 哈希(Hash)命令详解(四)
    Python操作redis字符串(String)详解 (三)
    How to Install MySQL on CentOS 7
    Linux SSH远程文件/目录 传输
  • 原文地址:https://www.cnblogs.com/fanling521/p/5383879.html
Copyright © 2011-2022 走看看