MySQL MyISAM - 无法向表中添加新列

时间:2013-02-15 22:59:44

标签: mysql myisam alter-table

我有下表:

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,那么为什么会失败以及如何解决?

更新

我尝试将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;

但我仍然想知道发生了什么。

2 个答案:

答案 0 :(得分:0)

索引键只允许255我假设。

答案 1 :(得分:0)

这是因为myisam的索引长度限制为1000字节(see this link

请注意,这完全取决于字节,并且字符可能需要2个,3个甚至4个字节,具体取决于您的编码,以及INT will always be 4 bytes