Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在其他列中输入的每个不同值的MySQL自动增量?_Mysql_Auto Increment - Fatal编程技术网

在其他列中输入的每个不同值的MySQL自动增量?

在其他列中输入的每个不同值的MySQL自动增量?,mysql,auto-increment,Mysql,Auto Increment,我想在我的mysql数据库中创建一个列,该列根据输入到另一列中的特定值自动递增 例如(以下数据),当学生使用该网站创建新记录时,他/她将输入其班级的名称,并被分配一个数字变量(特定于该班级),教师可使用该变量识别该学生。有没有什么方法可以在不为每个类创建新表的情况下做到这一点 class_name / student_number classa / 1 classa / 2 classa / 3 classb / 1 classb / 2 classa / 4 classb / 3

我想在我的mysql数据库中创建一个列,该列根据输入到另一列中的特定值自动递增

例如(以下数据),当学生使用该网站创建新记录时,他/她将输入其班级的名称,并被分配一个数字变量(特定于该班级),教师可使用该变量识别该学生。有没有什么方法可以在不为每个类创建新表的情况下做到这一点

class_name / student_number

classa / 1

classa / 2

classa / 3

classb / 1

classb / 2

classa / 4

classb / 3

MyISAM有这样一个特点;InnoDB可能可以使用类似的子查询来模拟它

( SELECT MAX(student_number) + 1 FROM tbl WHERE class_name = ? )

看起来您要求的是一个自动增量,它在另一列中为每个不同的值保持一个单独的增量

正如@RickJames所回答的,这个特性存在于MyISAM存储引擎中,但在InnoDB中不起作用。原因与InnoDB的行级锁定有关:为了防止另一个并发客户端插入同一个“类”(根据您的示例),InnoDB必须在给定类的所有行上创建间隙锁

这不会影响MyISAM,MyISAM无论如何都会执行表级锁定,但对于InnoDB来说,这将极大地损害并发工作负载期间的吞吐量

这不是使用MyISAM的好理由

但是你应该放弃自动递增是某种序号或行号的想法,事实并非如此。这一切都是一种独特的价值;它没有其他意义


如果需要为每个类分配连续的学生id,则在应用程序中进行分配,并显式插入值。不要依赖自动递增机制来实现这一点。

我建议存储类的注册日期时间,然后使用select动态生成数字。我不太明白您的目的,但显然其他人会这么做。