上代码
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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




