暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

mysql 5.x版本 视图如何增加自增列

原创 aisql 2021-09-24
1326

上代码

create table t_Autoid(class_id int,cname varchar(20)); insert into t_Autoid(class_id,cname) values(101,'一班'),(102,'二班'),(103,'三班')

想创建 一个v_Autoid的视图,视图中新增加一个行号列
8.x版本利用窗口函数很简单

create or replace view v_Autoid as select *, row_number() over(order by class_id) as rowid from t_Autoid

看视图结果

select * from v_Autoid

class_id cname rowid
101 一班 1
102 二班 2
103 三班 3

但要在5.x 版本实现此功能,真的很难,我尝试了三种方法,最终成功
第一种失败的方法
5.x版本利用变量生成行号 单独执行select 语句 没有问题且能得到正确结果

select class_id,cname, (@a := @a+1) as rowid from t_Autoid,(select @a := 0) as t

但在创建视图的时候就报错了

create or replace view v_Autoid as select class_id,cname, (@a := @a+1) as rowid from t_Autoid,(select @a := 0) as t

会报一个错误
Error Code: 1351. View’s SELECT contains a variable or parameter
视图不能使用变量。 第一个方法失败了。

第二种方法 利用函数代替变量
首先创建一个函数

delimiter $$ create function getautoid(ifret bit) returns int no sql begin if ifret then set @auid := 0; else set @auid := ifnull(@auid,0) + 1; end if; return @auid; end$$ delimiter ;

然后再创建视图

create or replace view v_Autoid as select class_id,cname, getautoid(0) as rowid from t_Autoid

创建成功,且第一次执行 select * from v_Autoid 结果也正确
但第二次执行就会发现 row一直递增了,没有从1开始。
好 那就在执行的时候初始化一下
改select 语句

select class_id,cname, getautoid(0) as rowid from t_Autoid,(select getautoid(1)) t

多次执行 也正确了,但创建视图遇到了问题

create or replace view v_Autoid as select class_id,cname, getautoid(0) as rowid from t_Autoid,(select getautoid(1)) t

Error Code: 1349. View’s SELECT contains a subquery in the FROM clause

我X 视图不能包含子查询

这里,我思路断了好久,打算放弃了。后面想到一个小技巧 解决了

第三次尝试 (正确的结果,最终的答案)

create or replace view v_Autoid as select class_id,cname, if(CLASS_ID<= (select min(class_id) from t_Autoid ),getautoid(1),0) as expv, getautoid(0) as rowid from t_Autoid

此视图,不管执行多少次都会是正确的结果了。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论