Mysql

InnoDB 表的多列索引中的 MySQL 和 AUTO_INCREMENT 列:支持狀態?

  • December 21, 2021

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;

我的問題是,在我的一生中,我無法在 MySQL 的文件站點或其他地方找到支持該功能的積極聲明。我對在生產中部署一些未宣布的東西(可能是實驗性的)相當謹慎,所以我希望有人能指出我的官方狀態。

**編輯:**事實證明,該手冊在不相關的部分包含這個相當傾斜的聲明

“……具有 AUTO_INCREMENT 列的 InnoDB 表需要至少一個鍵,其中自動增量列是唯一的或最左邊的列。”

這表明但沒有說明支持。

**編輯 2:**使用來自下面@rolandoMYSQLDBA 的資訊,我還找到了這個附加片段“一個 AUTO_INCREMENT 列必須作為 InnoDB 表的索引中的第一列出現。” . 因此,我接受他的回答。

如果有人想知道,表分區需要多列索引 - 客戶在所有表上都有 auto_increment PK,他們希望在日期列上進行分區。

在正常情況下,我會將此問題作為重複問題關閉。已經有接近票數了。在這種特殊情況下,由於您對這個問題給予了賞金,我會盡力回答它。

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

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)
);

auto_increment 列是sr_no. 這既不是主鍵定義中的唯一列,也不是最左邊的列。現在,如果寫了主鍵

primary key (sr_no, app_id, test_id)

那麼sr_no將是最左邊的。InnoDB 不會發生錯誤。

當你執行命令時

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

你的 auto_increment 列id在最左邊。

提到了第二個文章。請注意,在第二篇文章的答案中,它明確指出 MyISAM 和 BDB 儲存引擎支持 auto_increment id。對於 MyISAM,auto_increment 行為允許 auto_increment 數字與一個或多個鍵配對,這樣數字 1 可以出現多次,但與列唯一關聯。這些年來,我多次討論過這個問題:

請記住,雖然 InnoDB 支持 a 中的 auto_increment 列PRIMARY KEY,但它的 auto_increment 行為與 MyISAM 不同。MyISAM 可以與其他列綁定以允許一個數字多次存在,InnoDB 不這樣做。一旦使用了 auto_increment 值,它對於整個表都是唯一的。

你找到的摘錄

具有 AUTO_INCREMENT 列的 InnoDB 表需要至少一個鍵,其中自動增量列是唯一的或最左邊的列。

來自MySQL 文件中的一個頁面,該頁面與複製如何查看和處理 auto_increment 值有關。這是一個至關重要的問題,因為在 Master 上寫入的訂單數據可能會在 Slave 上以不同的順序序列化。

就在最近(重新開始Jun 16, 2017)我回答了在主鍵之後創建帶有附加列的索引是否有意義?,我在 MySQL 文件中提到,當分區表中有 auto_increment 列時,該列必須PRIMARY KEY與定義表行分片的列一起包含在其中。

最後,讓我這樣說:在 InnoDB 中支持 auto_increment 列PRIMARY KEY並沒有像 MyISAM 那樣帶來任何附帶好處或額外的花哨。這就是為什麼 MySQL 文件沒有太多關於它的文章的原因。

很久以前就提到了對此的支持。如果您查看MySQL 5.1 文件InnoDB Restrictions,您會看到要點 #15

對於 AUTO_INCREMENT 列,您必須始終為表定義一個索引,並且該索引必須只包含 AUTO_INCREMENT 列。在 MyISAM 表中,AUTO_INCREMENT 列可能是多列索引的一部分。

MySQL 5.1 文件AUTO_INCREMENT 處理 InnoDB中有更廣泛的內容。它也可以在 MySQL 5.5 文件中找到。不幸的是,這些都是舊的文件格式。這可能就是您現在找不到任何東西的原因。請放心,那裡有支持。

引用自:https://dba.stackexchange.com/questions/182572