MySQLエラー: キー長を指定せずにインデックスを作成する方法
MySQLエラー: キー仕様にキー長がない
原因
このエラーが発生する理由は、次のとおりです。
CREATE INDEX
またはALTER TABLE ADD INDEX
ステートメントで、KEY_LENGTH
オプションが指定されていない。KEY_LENGTH
オプションに、有効な値が指定されていない。
解決方法
このエラーを解決するには、次のいずれかの方法を実行します。
KEY_LENGTH
オプションを指定して、インデックスのキー長を指定します。
例:
-- キー長を指定してインデックスを作成
CREATE INDEX index_name (column_name(key_length));
-- デフォルトのキー長を使用してインデックスを作成
CREATE INDEX index_name (column_name);
デフォルトのキー長:
- 文字列型の場合: 255バイト
- 数値型の場合: データ型によって異なります
- このエラーは、
STRICT_TRANS_TABLES
SQL モードが有効になっている場合にのみ発生します。 KEY_LENGTH
オプションは、VARCHAR
型、CHAR
型、BINARY
型、VARBINARY
型の列にのみ使用できます。
CREATE TABLE customers (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL,
PRIMARY KEY (id),
INDEX name_index (name(100))
);
この例では、customers
テーブルに 2 つのインデックスを作成します。
- 主キー (
id
) name
列の最初の 100 文字に基づくインデックス (name_index
)
例2: デフォルトのキー長を使用してインデックスを作成する
CREATE TABLE products (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
description TEXT NOT NULL,
PRIMARY KEY (id),
INDEX name_index (name)
);
CHAR
型の列にインデックスを作成する
CREATE TABLE users (
id INT NOT NULL AUTO_INCREMENT,
username CHAR(16) NOT NULL,
email VARCHAR(255) NOT NULL,
PRIMARY KEY (id),
UNIQUE INDEX username_index (username)
);
CREATE TABLE images (
id INT NOT NULL AUTO_INCREMENT,
image BLOB NOT NULL,
PRIMARY KEY (id),
INDEX image_index (image(1024))
);
これらの例は、さまざまなデータ型とキー長を使用してインデックスを作成する方法を示しています。
別のデータ型を使用する:
TEXT
型または BLOB
型の列にインデックスを作成しようとしている場合は、代わりに VARCHAR
型または VARBINARY
型を使用できます。これらのデータ型は、最大長を指定でき、キー長を指定する必要がありません。
-- TEXT 型の列を VARCHAR 型に変更
ALTER TABLE table_name CHANGE COLUMN column_name VARCHAR(255) NOT NULL;
-- BLOB 型の列を VARBINARY 型に変更
ALTER TABLE table_name CHANGE COLUMN column_name VARBINARY(1024) NOT NULL;
サフィックスを使用する:
VARCHAR
型または VARBINARY
型の列にインデックスを作成する場合は、列名の後にサフィックスを付けて、キー長を指定できます。
CREATE INDEX index_name (column_name_100);
この例では、column_name
列の最初の 100 文字に基づくインデックス (index_name
) を作成します。
FULLTEXT インデックスを使用する:
InnoDB
ストレージエンジンを使用している場合は、FULLTEXT
インデックスを使用して、全文検索を行うことができます。FULLTEXT
インデックスは、キー長を指定する必要がありません。
CREATE FULLTEXT INDEX index_name (column_name);
mysql sql mysql-error-1170