InnoDB 表的多列索引中的 MySQL 和 AUTO_INCREMENT 列:支持状态?

Ali*_*orm 6 mysql innodb index

在 InnoDB 表的多列索引中缺少对 AUTO_INCREMENT 列的支持是一个广为人知的限制,就像需要时的触发器解决方法一样(参见例如这篇文章)。然而,昨天,我遇到了这个帖子,声称早在 5.1 就添加了对该功能的支持。我在我的 5.7 安装 (mysql-community-server-5.7.19-1.el7.x86_64) 上尝试了以下语句,它似乎完美地工作:

CREATE TABLE `tbl1` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `data` datetime NOT NULL,
  PRIMARY KEY (`id`,`data`)
 ) ENGINE=InnoDB;
Run Code Online (Sandbox Code Playgroud)

我的问题是,在我的一生中,我无法在 MySQL 的文档站点或其他地方找到对该功能的支持的肯定声明。我对在生产中部署一些未经宣布的东西(可能是实验性的)相当谨慎,所以我希望有人能指出我的官方状态。

编辑:事实证明,该手册在不相关的部分包含了这个相当间接的声明

“……带有 AUTO_INCREMENT 列的 InnoDB 表至少需要一个键,其中自动增量列是唯一或最左边的列。”

这表明但没有说明支持。

编辑 2:使用下面来自@rolandoMYSQLDBA 的信息,我还找到了这个附加片段“AUTO_INCREMENT 列必须作为 InnoDB 表索引中的第一列出现。” . 因此,我接受他的回答。

如果有人想知道,表分区需要多列索引 - 客户在所有表上都有 auto_increment PK 并且他们想要在日期列上进行分区。

Rol*_*DBA 6

在正常情况下,我会关闭这个问题作为重复。已经有接近的票数了。在这个特定的例子中,既然你对这个问题悬赏,我会尽量回答它。

看看你提到第一篇文章。注意表定义

CREATE  TABLE `issue_log` (
`sr_no` INT NOT NULL AUTO_INCREMENT ,
  `app_id` INT NOT NULL ,
  `test_id` INT NOT NULL ,
  `issue_name` VARCHAR(255) NOT NULL ,
primary key (app_id, test_id,sr_no)
);
Run Code Online (Sandbox Code Playgroud)

auto_increment 列是sr_no. 这既不是主键定义中的唯一列,也不是最左边的列。现在,如果主键被写入

primary key (sr_no, app_id, test_id)
Run Code Online (Sandbox Code Playgroud)

那么sr_no将是最左边的。InnoDB 不会发生错误。

当你运行命令时

CREATE TABLE `tbl1` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `data` datetime NOT NULL,
  PRIMARY KEY (`id`,`data`)
) ENGINE=InnoDB;
Run Code Online (Sandbox Code Playgroud)

您的 auto_increment 列id在最左边。

提到了第二篇文章。请注意,在第二篇文章的回答中,它明确指出 MyISAM 和 BDB 存储引擎支持 auto_increment ids。当涉及到 MyISAM 时,auto_increment 行为允许 auto_increment 数字与一个或多个键配对,这样数字 1 可以出现多次但与列唯一关联。这些年来我已经讨论过几次:

请记住,虽然 InnoDB 支持 a 中的 auto_increment 列PRIMARY KEY,但它没有与 MyISAM 相同的 auto_increment 行为。MyISAM 可以与其他列绑定以允许一个数字多次存在,InnoDB 不会这样做。一旦使用了 auto_increment 值,它对于整个表来说是唯一的。

你找到的摘录

具有 AUTO_INCREMENT 列的 InnoDB 表至少需要一个键,其中自动增量列是唯一或最左边的列。

来自MySQL 文档中的一个页面,该页面与复制如何查看和处理 auto_increment 值有关。这是一个至关重要的问题,因为在 Master 上写入的订单数据可能会在 Slave 上以不同的顺序进行序列化。

就在最近(重新开始Jun 16, 2017)我回答在主键之后创建带有附加列的索引是否有意义?,我在 MySQL 文档中提到,当分区表中有 auto_increment 列时,必须将该列PRIMARY KEY与定义表行分片的列一起包含在其中。

总而言之,让我这样说:对PRIMARY KEYInnoDB中 a中的auto_increment 列的支持不会像 MyISAM 那样带来任何附带好处或额外的花里胡哨。这就是为什么 MySQL 文档没有很多关于它的文章。

很久以前就提到了对此的支持。如果您查看MySQL 5.1 文档InnoDB Restrictions,您会看到第 15 条要点

对于 AUTO_INCREMENT 列,您必须始终为表定义一个索引,并且该索引必须只包含 AUTO_INCREMENT 列。在 MyISAM 表中,AUTO_INCREMENT 列可能是多列索引的一部分。

InnoDB中的 MySQL 5.1 文档AUTO_INCREMENT 处理中有更广泛的内容。它也可以在 MySQL 5.5 文档中找到。不幸的是,这些都是旧的文档格式。这可能就是你现在找不到任何东西的原因。请放心,支持就在那里。


归档时间:

查看次数:

3858 次

最近记录:

8 年,1 月 前