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

标签 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;

但我还是想知道发生了什么。

最佳答案

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

请注意,这都是关于字节的,一个字符可能需要 2、3 甚至 4 个字节,具体取决于您的编码,还有一个 INT will always be 4 bytes .

关于MySQL MyISAM - 无法向表中添加新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14904795/

相关文章:

mysql - 使用提前 6 小时的日期时间更新表

php - 在数据库中存档推文(避免重复)

php - 在通过php从xml文件插入记录之前查询mysql数据库

sql-server - 在不删除sql server中的表的情况下无法添加列

mysql - mysql中多删除和多表删除哪个更快?

mysql - 如何删除MySQL InnoDB中的所有相关记录?

mysql - 如何加快Mysql中日期时间的查询速度

mysql - 虚拟主机不支持 InnoDB。现在怎么办?

mysql - 如果存在则更改表,如果不存在则创建

sqlite alter table 在单个语句中添加多个列