delimiter //
CREATE FUNCTION `func_inc_var_session`( val int) RETURNS int
NO SQL
NOT DETERMINISTIC
begin
if val = 0 THEN set @var := -1; end if;
SET @var := IFNULL(@var,0) + 1;
return @var;
end
//
字符串 假设我们有一个视图定义(为了说明的目的而过于简化)
CREATE VIEW v_test1
SELECT a.field1
FROM test_table a
型 修改为
CREATE VIEW v_test1
SELECT a.field1, func_inc_var_session(0) as rownum
FROM test_table a
型 能胜任这份工作但是,在一个会话中多次运行select * from v_test将给予连续的行号,例如,第一次以1开始,第二次以视图中的记录数开始,等等。 为了重置rownum,我创建了另一个视图(由于mysql视图限制-它不能在FROM中有子查询): CREATE VIEW v_reset AS SELECT func_inc_var_session(1) ;个 现在我们可以做
CREATE VIEW v_test1
SELECT a.field1, func_inc_var_session(0) as rownum
FROM test_table a, v_reset
2条答案
按热度按时间yizd12fk1#
我不认为有一个标准的方法,但这里的方法似乎值得一试。
想法是为视图动态生成唯一的“id”值(类似于rownum)。Create a view with column num_rows - MySQL函数的一个修改版本(为了重置rownum而做的修改):
字符串
假设我们有一个视图定义(为了说明的目的而过于简化)
型
修改为
型
能胜任这份工作但是,在一个会话中多次运行
select * from v_test
将给予连续的行号,例如,第一次以1开始,第二次以视图中的记录数开始,等等。为了重置rownum,我创建了另一个视图(由于mysql视图限制-它不能在
FROM
中有子查询):CREATE VIEW v_reset AS SELECT func_inc_var_session(1) ;
个现在我们可以做
型
(FROM子句,则
func_inc_var_session(1)
将在查询期间仅执行一次,因此它将重置rownum)。希望能帮上忙。
xtfmy6hx2#
如果不进行以下更改,无法使上述代码工作。
CREATE VIEW v_test1 SELECT a.field1,func_inc_var_session(1)as rownum FROM test_table a
CREATE VIEW v_reset AS SELECT func_inc_var_session(*0 *);
主视图(v_test1)每次需要重置为1。v_reset函数每次需要“重置”为零(0)。