【问题标题】: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 之前按您喜欢的顺序设置值,请执行此操作。

标签: mysql last-insert-id


【解决方案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,但始终指定它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 2020-08-27
    • 2018-09-09
    • 1970-01-01
    相关资源
    最近更新 更多