• 数据库自增字段是字符型的简单处理


    在做数据库练习的时候,遇到一个问题,是以前从未接触但是看过人家实现的问题:
    描述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 

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

    记录下。

  • 相关阅读:
    apache2 开源协议
    zend framework入门教程
    对open页的打开页面进行刷新
    mysql -- 视图
    MySQL ---存储过程和触发器
    mysql --存储过程 select ...into
    mysql -- 存储过程,游标,错误异常处理
    mysql --存储过程 退出
    mysql -- 存储过程 in out inout
    mysql -- 死锁
  • 原文地址:https://www.cnblogs.com/fanling521/p/5383879.html
Copyright © 2020-2023  润新知