MySQL 5.5 及更早版本,AUTO_INCREMENT 列必須是主鍵(或唯一索引的第一列)。嘗試將主鍵改為聯合主鍵時:
ALTER TABLE `order` DROP PRIMARY KEY, ADD PRIMARY KEY (`user_id`, `order_id`); -- ERROR 1075 (HY000): Incorrect table definition; there can be only one auto column and it must be defined as a key
AUTO_INCREMENT 列參與主鍵定義,且僅允許一個自增列。(user_id, order_id) 為聯合主鍵保證業務唯一性,同時保留 id BIGINT AUTO_INCREMENT 作為技術主鍵/聚簇索引。新版本移除該限制,AUTO_INCREMENT 列只需被索引覆蓋(可為非主鍵唯一索引或普通索引首列),即可構建任意主鍵組合。
-- 5.6+ 可直接執行 ALTER TABLE `order` DROP PRIMARY KEY, ADD COLUMN `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT FIRST, ADD UNIQUE KEY `uk_auto` (`id`), ADD PRIMARY KEY (`user_id`, `order_id`);
(user_id, order_id) 建為 唯一索引 而非主鍵:ALTER TABLE `order` ADD UNIQUE KEY `uk_user_order` (`user_id`, `order_id`); -- 主鍵仍為 id AUTO_INCREMENT,業務唯一性由唯一索引保證
(user_id, order_id) 組織,用戶查詢訂單範圍掃描極快(避免回表)。MySQL 5.5 前版本 AUTO_INCREMENT 必須為主鍵,導致無法直接建立業務聯合主鍵。升級至 5.6+ 即可完美解決;不可升級時,採用「技術主鍵 + 業務唯一索引」模式兼顧自增與業務約束。