2

私は次の表を持っています:

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ですが、なぜ失敗するのか、どのように修正するのですか?

アップデート

列のインデックスのサイズをkeyword333から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;

しかし、私はまだ何が起こっているのか知りたいです。

4

2 に答える 2

0

これは、myisamのインデックスの長さが1000バイトに制限されているためです(このリンクを参照

これはすべてバイトに関するものであり、エンコーディングによっては文字が2、3、または4バイトかかる場合があり、INTは常に4バイトになることに注意してください。

于 2013-02-15T23:38:42.753 に答える
0

インデックス キーは 255 のみを許可します。

于 2013-02-15T23:30:01.213 に答える