InnoDB 表的多列索引中的 MySQL 和 AUTO_INCREMENT 列:支持狀態?
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 可以出現多次,但與列唯一關聯。這些年來,我多次討論過這個問題:
Apr 21, 2012
:你怎麼能在一張表中有兩個自動增量列?Jun 10, 2012
: MySQL 在沒有自動增量的情況下獲取下一個唯一值Feb 26, 2013
:如何在 MySQL phpmyadmin 中使用 2 個自動增量列Aug 28, 2013
:如何去建模關係的主要對象?請記住,雖然 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 文件中找到。不幸的是,這些都是舊的文件格式。這可能就是您現在找不到任何東西的原因。請放心,那裡有支持。