2013-02-15 64 views
2

我有如下表:的MySQL的MyISAM - 無法將新列添加到表

mysql> show create table keyword_links\G 
*************************** 1. row *************************** 
     Table: keyword_links 
Create Table: CREATE TABLE `keyword_links` (
    `keyword_id` int(11) NOT NULL AUTO_INCREMENT, 
    `keyword` tinytext NOT NULL, 
    `link` tinytext, 
    `weight` smallint(6) NOT NULL DEFAULT '0', 
    `class_id` smallint(6) NOT NULL DEFAULT '0', 
    `category_id` smallint(6) NOT NULL DEFAULT '0', 
    `timestamp` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    PRIMARY KEY (`keyword_id`), 
    KEY `class_id` (`class_id`), 
    KEY `category_id` (`category_id`), 
    KEY `idx_keyword` (`keyword`(333)) 
) ENGINE=MyISAM AUTO_INCREMENT=5082 DEFAULT CHARSET=utf8 

到我試圖添加新列,這是失敗的:

mysql> ALTER TABLE keyword_links ADD COLUMN list_id INT UNSIGNED NOT NULL DEFAULT 0; 
ERROR 1170 (42000): BLOB/TEXT column 'keyword' used in key specification without a key length 

keyword列的索引確實有一個333的關鍵長度,那爲什麼它失敗了,以及如何解決它?

UPDATE

我試圖減少從333到255的keyword列的索引的大小,現在我可以添加成功新列:

ALTER TABLE keyword_links DROP INDEX idx_keyword; 
CREATE INDEX index_keyword ON keyword_links (keyword(255)); 
ALTER TABLE keyword_links ADD COLUMN list_id INT UNSIGNED NOT NULL DEFAULT 0; 

但我願意想知道發生了什麼事。

回答

0

這是因爲1000個字節(see this link

請注意的MyISAM索引的長度限制,這是所有關於字節,一個字符可能需要2,3甚至4個字節取決於你的編碼,並還有一個INT will always be 4 bytes

+0

創建索引時,MySQL不會發生抱怨,這真的很奇怪。當我做'CREATE INDEX index_keyword ON keyword_links(關鍵字(333));'它沒有給出任何錯誤或警告。只有當我試圖向表中添加新列時,它纔會發生錯誤。 – arun 2013-02-16 02:48:55

0

索引鍵將只允許255我承擔。

+0

嗯,不正確。我剛剛嘗試了以下方法:'ALTER TABLE keyword_links DROP INDEX index_keyword;','CREATE INDEX index_keyword ON keyword_links(keyword(333));'並且它沒有失敗或給出任何警告。 – arun 2013-02-15 23:35:07

+0

警告是因爲它只考慮255長度。 – geek 2013-02-15 23:48:08