我正在设置一个需要两个自动递增字段“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/