【问题标题】:Does the MySQL Auto Increment Column Need to Be Unique or a Primary KeyMySQL自增列需要唯一还是主键
【发布时间】:2020-11-04 04:30:20
【问题描述】:

我在 SQL Server 中开发了一个数据库,我使用标识列作为主键字段的种子。目的是在每年年初将标识重置为 1。这将允许我们创建年度 PK - 身份列。

Create Table Issues (
IssueID  AS RIGHT(CONVERT(VARCHAR, Year(getdate()), 4),2) + '-' + RIGHT(REPLICATE('0', 2) + 
CONVERT(VARCHAR, RecordID),3) NOT NULL PRIMARY KEY,
RecordID int Identity (1,1),.........)

结果是

 
IssueID RecordID 20-001 1 20-002 2 20-003 3 21-001 1 等等....

现在有人告诉我,我们将改用 MySQL 数据库。

  1. MySQL 中的自动增量字段能否像 SQL Server 中一样包含重复值?
  2. 如果不是,我该如何做我需要在 MySQL 中做的事情?

【问题讨论】:

  • 您可以在 AUTO_INCREMENT 列中包含重复值,但 AUTO_INCREMENT 功能本身不会以任何您希望的方式帮助您。

标签: mysql auto-increment


【解决方案1】:

在 MySQL 中,一张表只能有一个 auto_increment 列,并且该列必须是主键的一部分。详情见here

您的任务的技术解决方法是创建一个具有单个 auto_increment 列的表,您可以通过在该表中插入一条记录并立即调用标准 MySQL 函数 last_inser_id() 来获取 auto_increment 值。到时候你应该截断表格 - 在这种情况下,auto_increment 计数将被重置。

【讨论】:

    【解决方案2】:

    在 MySQL 中,您不能对所描述的内容使用默认的自动增量功能,即每年开始的增量值。

    这是多年前 MyISAM 存储引擎的一项功能。作为多列主键的第二列的自动增量将从 PK 的第一列中的每个不同值开始计数。请参阅本页“MyISAM 笔记”下的示例:https://dev.mysql.com/doc/refman/8.0/en/example-auto-increment.html

    但使用 MyISAM 被认为不是一个好主意,因为it does not support ACID。一般来说,我会找到另一种解决此任务的方法。我不会使用 MyISAM。

    在 InnoDB 中,表不会生成与表中当前值重复的值,甚至不会生成小于先前为该表生成的最大值的值。换句话说,没有办法使用自动增量来“填补空白”。

    您可以使用ALTER TABLE mytable AUTO_INCREMENT=1重置计数器,但您设置的值会自动前进到当前表中的最大值+1。

    因此,您必须使用另一个表或 MySQL 数据库以外的其他东西来生成它。例如,我看到有人使用 memcached,它支持原子的“递增和返回计数器”操作。

    要考虑的另一件事:如果您每年需要一个行计数器,这实际上与使用 MySQL 的自动增量功能不同。将后者用作行计数器并不容易。此外,如果您回滚事务或删除行会发生什么?您最终会得到不连续的 RecordId 值,并带有无法解释的“间隙”。这也是关于自动增量功能的一个事实,它保证后续的 id 会更大,但是it does not guarantee to generate all values consecutively。所以无论如何你最终都会得到差距。

    【讨论】:

      猜你喜欢
      • 2012-01-31
      • 1970-01-01
      • 2011-09-16
      • 2010-11-12
      • 2011-07-21
      • 2010-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多