添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
腼腆的炒粉  ·  特征选择 ...·  9 月前    · 
活泼的红金鱼  ·  vba formatconditions ...·  1 年前    · 
善良的凉面  ·  linux - How to ...·  2 年前    · 

在 MySQL 中,视图不支持直接使用变量来生成序号,因为视图是基于静态 SQL 查询定义的,而变量是在运行时动态计算的。不过,你可以通过一些技巧来实现类似的效果。以下是一个常见的方法,使用子查询来初始化变量,然后在视图中使用这些变量。

  1. 创建一个子查询来初始化变量
  2. 在视图中使用这个子查询

假设你有一个表 your_table ,结构如下:

CREATE TABLE your_table (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    age INT
方法一:使用子查询初始化变量
  1. 创建一个子查询来初始化变量
SELECT 
    (@row_number := @row_number + 1) AS row_num, 
    t.id, 
    t.name, 
    t.age
    (SELECT @row_number := 0) r,
    your_table t
ORDER BY 
    t.id;
  1. 创建视图
CREATE VIEW your_view AS
SELECT 
    (@row_number := @row_number + 1) AS row_num, 
    t.id, 
    t.name, 
    t.age
    (SELECT @row_number := 0) r,
    your_table t
ORDER BY 
    t.id;

一会儿就被接下来的问题给我打断了, 也就是说, 这样查询是没毛病的, 但是吧, 如果你用视图, 会发现一个惊喜的错误:

1351 - View's SELECT contains a variable or parameter, Time: 0.000000s

 这句话的意思是, 您不能再视图中使用参数哦, 哎, 多么友好的提示, 在MySQL中, 数据库视图是不能够使用参数的,, 但是不影响, 实践是检验真理的唯一标准。

如果不能用变量, 那我们只能换一种思路了, 我们能不能用函数呢? 写一个函数, 让每次返回的值都自动+1不就好了, 下面就是这个函数

DELIMITER //
CREATE FUNCTION func_auto_increment(RESET BIT) RETURNS INT
NO SQL
BEGIN
      IF RESET THEN
        SET @var := 0;
        SET @var := IFNULL(@var,0) + 1;
        END IF;
        RETURN  @var;
    END//
DELIMITER ;

方法二:使用窗口函数(MySQL 8.0+)

如果你使用的是 MySQL 8.0 或更高版本,可以使用窗口函数 ROW_NUMBER() 来生成序号,这种方法更简洁且不需要变量。

  1. 创建视图
CREATE VIEW your_view AS
SELECT 
    ROW_NUMBER() OVER (ORDER BY id) AS row_num, 
    name, 
    your_table;

假设 your_table 包含以下数据:

INSERT INTO your_table (id, name, age) VALUES
(1, 'Alice', 30),
(2, 'Bob', 25),
(3, 'Charlie', 35);

无论你使用哪种方法创建视图,查询视图的结果都会包含序号列:

SELECT * FROM your_view;

输出结果:

+---------+----+--------+-----+
| row_num | id | name   | age |
+---------+----+--------+-----+
|       1 |  1 | Alice  |  30 |
|       2 |  2 | Bob    |  25 |
|       3 |  3 | Charlie|  35 |
+---------+----+--------+-----+
  • 使用子查询初始化变量:适用于所有版本的 MySQL,但代码稍微复杂一些。
  • 使用窗口函数:适用于 MySQL 8.0 及以上版本,语法简洁,推荐使用。
SELECT (@i:=@i+1) pm, SUM(scores) totalScore, id, name FROM stu_record ,(select @i:=0) t GROUP BY id ORDER by totalScore desc 这里的 sql中的 t 这张表 其实就是 一条 i=0 的数据 select赋值时必须使用“:=”赋值 SELECT ( @i := @i + 1 ) AS `Num`, A.* FROM 表名 /视图名/子查询 A,( SELECT @i := 0 ) B 因为在视图创建工具里,不用写创建视图的CREATE VIEW 语句,保存的时候起一个视图表的名字就行 可以用表名,视图名,子查询都行,子查询记得用括号括起来 结果如下:(其他字段遮蔽了) 事务一般由删改操作自动调用,事务根据数据库不同提交的时机也是不同的 ​ mysql数据库默认执行删改就会提交事务 ​ 我们可以设置为 手动提交 begin 或者 start transaction; 事务的特征 ​ ACID原则: ​ 原子性 ​ 事...
innodb的自的值是存储内存中,每次重新启动之后,第一次打开表的时候,从里面取最大的id值+1作为下一次的自值。 mysql在8.0之后才有了将自值持久化的能力,将自值存到了redolog里面。 自不连续的原因: 唯一键冲突是导致自主键 id 不连续的第一种原因。 先插入一个数据的时候,自id为1,然后再次插入一个数据时,自值为2,此时数据中某个唯一键冲突了,插入失败。 如果再有...
MySQL中,视图(View)是一个虚拟表,只包含了SQL查询语句,并不直接存储数据。因此,视图不支持像普通表那样具有自列。MySQL视图是只读的,所以不能向视图中添加、更新或删除数据,也就无法直接在视图实现序号。 但是,你可以在视图的查询中使用MySQL的用户变量或者一些计算方法来模拟自序列。下面是一个简单的例子,演示如何在视图中模拟自序号: ```sql SELECT (@rownum:=@rownum+1) AS auto_increment_id, (SELECT @rownum:=0) r, your_view_name v; 在这个例子中,我们使用了一个名为`your_view_name`的视图。我们首先初始化了一个用户变量`@rownum`,然后在查询中将它递,并将这个递的值作为`auto_increment_id`列返回。这样,每次查询视图时,都会得到一个递序号。 请注意,这种方法生成序号只是在查询结果集中的临时序列,并不是视图中数据的实际物理列。如果视图的底层查询涉及到排序,那么模拟的自序列可能需要根据排序来调整变量的初始化和递逻辑。