mysql - 一张 MySQL 表中的两个自增字段

标签 mysql auto-increment

我正在设置一个需要两个自动递增字段“id”和“member#”的表。

对于新数据,我将在后者上使用 AUTO_INCRMENT = 1001,因为存在成员编号小于 1000 的旧数据。

我将在“id”字段上使用“MAX(id)+1”来自动递增它。

但我不确定每当有插入时这是否能完成工作,甚至不确定将那段代码放在哪里。我在这里想做的只是自动递增字段,而不是选择任何内容。

出于好奇,为什么每个表只有一个 AUTO_INCRMENTing 字段?

当然,编写 AUTO_INCRMENT_2、AUTO_INCRMENT_3 等代码并不困难。

感谢所有答案和帮助。

==================================

其他信息和链接

很抱歉我的回复延迟了,我一直在做额外的研究。

好吧,进一步解释一下,我们有人通过网络加入我们的小组。因此,我们需要为每个人分配一个唯一的成员(member)编号。两个约翰会吗?两个不同的成员(member)号码。为此,我将 member# 列设置为 AUTO_INCRMENT,然后将 AUTO_INCRMENT = 1001 设置为表选项。旧成员(member)号码为三位数,新成员(member)号码为四位数。因此,每次有人在网络上注册为新成员(member)时,都会有一个插入命令自动将该系列中的下一个四位成员(member)号码分配给新成员(member)。

成员# INT(6) 无符号非空唯一键自动递增 并作为表选项 AUTO_INCRMENT = 1001

我希望这一点很清楚。其他情况下,有人可能想要使用类似的策略,可能是分配连续的发票编号、收据编号、帐号等。那么如何保证 +1 结果,即连续的数字?

现在我们还需要一个表 id 列。很多表都需要表 ID。它也需要分配一个 AUTO_INCRMENT 值,在我们的例子中,从 1 开始,并递增 1(默认值),以识别和区分一行与另一行。但不幸的是,MySQL 中每个表只能有一个 AUTO_INCREMENT 列。 :-/

所以这种情况属于一类称为 MAX+1 问题的问题。 (它也可能与 ROW_COUNT 和 LAST_INSERT_ID 解决方案有关。)每个表单个 AUTO_INCRMENT 字段的限制需要 MAX+1 解决方法,我正在寻找有关实现此目的的最佳方法的建议。例如,在定义 id 字段时,有没有办法在 CREATE TABLE 命令本身内部进行设置?或者其他同样简单的事情,例如编写函数。确实,最好是针对效率进行优化并仅使用所需的功能,而不是执行一系列命令。通常建议的解决方法可能是:

Lock tables membership write;
$max = SELECT MAX(id) FROM membership;
INSERT INTO membership ( id, firstname, lastname )
VALUES ($max+1 , 'jane', 'smith')
unlock tables;

还有更好的吗?

至于 AUTO_INCRMENT_2/_3... 功能是否应该存在。好吧,我必须指出,MySQL 中有很多功能我永远不会使用,但显然有人需要它们。尽管如此,在您可能需要它的(罕见)场合使用它会很方便。也许在任何给定的表上拥有可用的功能和使用它之间存在区别。我怀疑未使用的功能需要大量额外的内存或点击(无论如何,现在这些功能相当便宜)。

一些链接可能对理解这种情况有用:

https://duckduckgo.com/?q=mysql+max%2B1+problems&t=ffab&atb=v1-1&ia=web

Insert and set value with max()+1 problems

Problem with MySql INSERT MAX()+1

https://bugs.mysql.com/bug.php?id=3575

感谢所有答案、建议和帮助。

最佳答案

每个InnoDB表最多有一个自增计数器。这是实现的一部分。如果可以在同一个表中定义N个自增列,那么就需要更多的存储空间来存储N个计数器。当您递增 N 个计数器时,这将需要自动递增锁持续更长时间。

至于为什么每个表只有一个,当然,他们可能可以实现支持多个表,但为什么呢?

对于 99.99% 的应用不需要的情况,这会使实现变得更加复杂,并降低性能。

他们试图解决大多数情况下的需求。几乎在所有具有自动增量的表的情况下,每个表一个就足够了。

在几乎所有情况下,如果像您这样的人认为每张 table 需要多个 table ,您最好退后一步,重新考虑您的设计。

关于mysql - 一张 MySQL 表中的两个自增字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59775557/

相关文章:

mysql - 为什么 POINT() 被存储为 ??*??E@z?3M??Q?在 mysql 表中

mysql - 如何获取插入行的 id?

MySQL - 自动增加到 guid

postgresql - 是否可以压缩主键/序列号?

mysql - 使用 SQL Server 后端将 iOS 应用程序连接到本地网络上的托管网站

php - 登录后如何访问用户信息?

C# 和 MySql.Data.MySqlClient

MySQL 修改自动递增为负数

Bash:每次运行该脚本时都会从脚本中增加一个变量

php - 在 MySQL 表中存储盐是否安全?