Mysql

MySQL 唯一鍵限制

  • March 30, 2018

我得到了一個我正在嘗試重建的數據庫轉儲。導入時出現以下錯誤:

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 中的城市(因為有多個郵政編碼)

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