2013-02-15 2 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

Я попытался уменьшения размера индекса на keyword колонки от 333 до 255, и теперь я могу добавить новый столбец успешно:

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

Это из индекса MyISAM в ограничит длиной 1000 байт (see this link)

Пожалуйста, обратите внимание, что это все о байтах, и что персонаж может принимать 2, 3 или даже 4 байта в зависимости от вашего кодирования, и также что INT will always be 4 bytes.

+0

Странно, что MySQL не жалуется при создании индекса. Когда я сделал CREATE INDEX index_keyword ON keyword_links (ключевое слово (333)), 'он не дал никаких ошибок или предупреждений. Это дает ошибку только тогда, когда я пытаюсь добавить новый столбец в таблицу. – arun

0

Ключ индекса позволит принять только 255.

+0

Хм, неправда. Я просто попробовал следующее: 'ALTER TABLE keyword_links DROP INDEX index_keyword;', 'CREATE INDEX index_keyword ON keyword_links (ключевое слово (333));' и оно не терпит неудачу или не дает никаких предупреждений. – arun

+0

Предупреждение, потому что он рассматривает только длину 255. – geek

Смежные вопросы