CREATE TABLE your_table (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT
方法一:使用子查询初始化变量
- 创建一个子查询来初始化变量:
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;
- 创建视图:
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()
来生成序号,这种方法更简洁且不需要变量。
- 创建视图:
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`列返回。这样,每次查询视图时,都会得到一个递增的序号。
请注意,这种方法生成的序号只是在查询结果集中的临时序列,并不是视图中数据的实际物理列。如果视图的底层查询涉及到排序,那么模拟的自增序列可能需要根据排序来调整变量的初始化和递增逻辑。