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 在我的情况下是不是正确实施?的主要内容,如果未能解决你的问题,请参考以下文章