AUTO_INCREMENT 在我的情况下是不是正确实施?

Posted

技术标签:

【中文标题】AUTO_INCREMENT 在我的情况下是不是正确实施?【英文标题】:Is AUTO_INCREMENT implemented properly in my case?AUTO_INCREMENT 在我的情况下是否正确实施? 【发布时间】:2012-11-06 09:22:32 【问题描述】:

这个问题和我的old question, Getting last record from mysql有点关系。

根据这些答案,我了解到 SELECT 不能保证以任何特定顺序返回行(当然,不使用 ORDER BY 子句)。

我按照@YaK 的回答并使用以下命令在表中添加了AUTO_INCREMENT

ALTER TABLE maxID ADD sequence INT DEFAULT NULL;
ALTER TABLE maxID ADD INDEX(sequence);
ALTER TABLE maxID MODIFY sequence INT AUTO_INCREMENT;

但是今天我有一个问题。

如果SELECT 不能保证以任何特定顺序返回行(当然不使用ORDER BY 子句),那么在更改表时,AUTO_INCREMENT 会正确实现吗?

【问题讨论】:

你试过运行一些测试吗? @GregD :不,我在阅读旧答案时遇到了这个问题。做测试也很困难,因为我必须手动检查每一行并且有数千行...... 取决于您如何进行此类测试。我认为(1)使用自动增量创建表,(2)填充样本数据,(3)删除主键,(4)使用自动增量值创建新列,然后(5)简单的SELECT col FROM t WHERE col1 != col2 应该可以解决问题。我认为 InnoDB 和 MyISAM 引擎之间可能存在一些差异。 @GregD:嗯,让我检查一下... 添加 AUTO_INCREMENT 列将“正确地”为您提供唯一的递增值。除此之外的任何事情都是运气。如果您想在启用 AUTO_INCREMENT 之前按您喜欢的顺序设置值,请执行此操作。 【参考方案1】:

取决于后台发生的引擎类型:

'对于 MyISAM 和 BDB 表,您可以在多列索引中的辅助列上指定 AUTO_INCREMENT。在这种情况下,AUTO_INCREMENT 列的生成值计算为 MAX(auto_increment_column) + 1 WHERE prefix=given-prefix。当您想要将数据放入有序组时,这很有用。'

这将在 auto_increment 上创建具有多个非唯一值的表。

所以你真正的意思是为 InnoDB 表提供一个带有 auto_increment 的 PRIMARY KEY(尽管不是必需的)。在没有 order by 子句的情况下选择时,简单的 select 将按主键顺序返回值,因为它是按此顺序存储的,并将使用主键进行排序。

如果您想要一个特定的订单,请始终指定它,如果您愿意,请使用 PRIMARY KEY,但始终指定它。

【讨论】:

以上是关于AUTO_INCREMENT 在我的情况下是不是正确实施?的主要内容,如果未能解决你的问题,请参考以下文章

ID 字段 auto_increment 无法正常工作

auto_increment 跳 3 而不是 1

SQLAlchemy:如何在不使其成为主键的情况下使整数列 auto_increment (且唯一)?

在我的情况下是不是需要互斥锁[关闭]

在我的情况下,With(NoLock) 提示是不是危险?

在我的情况下,springBoot 是不是实现了 MVC 模式?