MySQL 唯一鍵限制
我得到了一個我正在嘗試重建的數據庫轉儲。導入時出現以下錯誤:
Too many key parts specified; max 16 parts allowed
轉儲中確實有超過 16 個關鍵部分。
我已經閱讀並理解了 InnoDB 的局限性,我不明白的是原始數據庫如何能夠創建超過 16 個部分的密鑰。
這是轉儲的相關部分:
CREATE TABLE `v1_view` ( `view_id` int(10) unsigned NOT NULL AUTO_INCREMENT, `view_date` date NOT NULL, `account_id` int(9) unsigned NOT NULL DEFAULT '0', .... PRIMARY KEY (`view_id`), UNIQUE KEY `viewUnique` (`view_date`,`account_id`,`player_id`,`video_id`,`order_id`,`orderlist_id`,`feed_id`,`domain_id`,`location_id`,`city_id`,`region_id`,`dma_id`,`country_id`,`continent_id`,`browser_id`,`platform_id`,`os_id`,`size_id`,`autoplay`,`volume`,`pacing`,`ad_spend`,`ad_revenue`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
我有幾個想法:
- 它是使用舊版本的 MySQL 創建的,允許更多關鍵部分
ENGINE
即使轉儲說,它使用的是不同的InnoDB
不確定其中任何一個的有效性。我無法直接訪問原始數據庫,但如果需要,可能可以獲得更多資訊。
原來的數據庫怎麼會有這麼多部分的唯一鍵?如何複製這個數據庫?
不知何故,這是一個
VIEW
變成了一個TABLE
?我檢查了; 每個索引最多 16 列已存在“很長時間”並適用於“所有”引擎。 參考。我無法解釋你的具體問題。
另外,我認為還有比失敗更糟糕的問題
UNIQUE
。規範化“位置”之類的內容是不合理的,同時還包括此表中的所有欄位:
location_id
,city_id
,region_id
,dma_id
,country_id
,continent_id
也就是說,應該有一個包含所有這些列的不同表,但僅
location_id
在此表中。我建議您手動刪除該
UNIQUE
行,載入數據,然後清理諸如location_id
.
四 (4) 年前,有人遇到了同樣的問題,但有 64 個部分
我在執行 MySQL 5.7.12 的 Mac 上嘗試了 Limit on Number of Indexes on MySQL Table 中的測試腳本。它達到了64的極限。
複合索引可能會使這個問題變得更糟,達到強加的限制。
您看到的唯一索引有 23 列。啊!!!
RickJames 最初建議的就是您現在所能做的:
UNIQUE KEY
將腳本更改為KEY
. 您可以從那裡重新載入。也許你可以讓
dma_id
世界獨一無二。然後,放棄country_id,continent_id
索引。小心位於多個 DMA 中的城市(因為有多個郵政編碼)