连续的号断号补号 Mysql

要求连续的号中间是不能断号,而且是纯数字的

-- 这个sql能查询出当前有效的号前面一个号是多少例子:1到100号 中80号因为某种原因取消了,
-- 那需要把号码补上,以下sql能把80号查询出来,但是这个sql有2个问题,第一个就是当数据量稍微大一点,
-- 效率会很慢,第二这个号补号是从后往前的就是80-90号都取消了,那会从90号往前补。
	select num-1 as num from table b
        where b.num > (select  max(num)+1 from table b1
         where b1.num <  b.num and type in ('1','0'))
        LIMIT 0 ,1
-- 新增一个变量,让这个变量有个初始值,这个值在和数据库中的数字进行对比,把对不上的数据标记起来,
-- 在筛出来,再取第一条数据,那这样就是最小的断号且查询数据也还可以。
	set @maxNo:= 160000;
    select rank_num from (
       select num ,@maxNo:= @maxNo+1 as rank_num ,
       @maxNo,case when num !=@maxNo then '1'  end  as maxNoCode
       from (select num from table WHERE type in ('0','1') GROUP BY num order by num )a
        ) a where maxNoCode ='1' LIMIT 0 ,1
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,可以使用如下 SQL 语句创建 `department` 表: ```sql CREATE TABLE department ( depno VARCHAR(2) PRIMARY KEY, deptname VARCHAR(20) ); ``` 然后可以使用如下 SQL 语句向 `department` 表中充填记录: ```sql INSERT INTO department (depno, deptname) VALUES ('01', '计算机科学与技术'), ('02', '软件工程'), ('03', '信息安全'); ``` 接下来,可以使用如下 SQL 语句创建自动生成学的存储过程 `sp_generateStuNo`: ```sql CREATE PROCEDURE sp_generateStuNo @StuName VARCHAR(50), @StuNo VARCHAR(10) OUTPUT AS BEGIN SET NOCOUNT ON; DECLARE @Year INT, @DepNo VARCHAR(2), @ClsNo INT, @StuSeq INT; DECLARE @MaxClsNo INT, @MaxStuSeq INT; -- 获取当前年份 SET @Year = YEAR(GETDATE()); -- 获取入学年份 SET @StuNo = CAST(@Year AS VARCHAR(4)); -- 前4位为入学年份 -- 获取专业编 SELECT @DepNo = depno FROM department WHERE deptname = '计算机科学与技术'; -- 假设专业为计算机科学与技术 SET @StuNo = @StuNo + @DepNo; -- 第5、6位为所在专业的编 -- 获取班级编和学 SELECT @MaxClsNo = MAX(ClsNo), @MaxStuSeq = MAX(StuSeq) FROM ( SELECT CAST(SUBSTRING(StuNo, 7, 2) AS INT) AS ClsNo, CAST(SUBSTRING(StuNo, 9, 2) AS INT) AS StuSeq FROM StudentInfo ) AS T WHERE ClsNo = 1; -- 假设班级编为1 IF @MaxClsNo IS NULL BEGIN SET @ClsNo = 1; SET @StuSeq = 1; END ELSE IF @MaxStuSeq < 40 BEGIN SET @ClsNo = @MaxClsNo; SET @StuSeq = @MaxStuSeq + 1; END ELSE BEGIN SET @ClsNo = @MaxClsNo + 1; SET @StuSeq = 1; END SET @StuNo = @StuNo + RIGHT('0' + CAST(@ClsNo AS VARCHAR(2)), 2); -- 第7、8位为班级编 SET @StuNo = @StuNo + RIGHT('0' + CAST(@StuSeq AS VARCHAR(2)), 2); -- 第9、10位为学 -- 插入新学生信息 INSERT INTO StudentInfo (StuNo, StuName) VALUES (@StuNo, @StuName); END; ``` 该存储过程的输入参数为 `@StuName`,表示学生姓名,输出参数为 `@StuNo`,表示生成的学。存储过程的实现逻辑如下: 1. 获取当前年份 `@Year`。 2. 将前4位设置为入学年份 `@Year`。 3. 根据所在专业名称查询 `department` 表,获取专业编 `@DepNo`,将第5、6位设置为该编。 4. 查询 `StudentInfo` 表中最大的班级编和学,根据递增编码规则计算出新的班级编和学。 5. 将班级编和学拼接成10位的学 `@StuNo`。 6. 向 `StudentInfo` 表中插入新的学生信息,包括学和学生姓名。 注意:上述存储过程的实现逻辑仅供参考,实际应用中需要根据具体情况进行修改和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值