背景
以下のSQL実行時に表題のエラーが発生した。
CREATE TABLE IF NOT EXISTS user (
user_id Integer NOT NULL COMMENT 'ユーザーID',
user_uuid text NOT NULL COMMENT 'ユーザーUUID',
user_name text NOT NULL COMMENT 'ユーザー名',
PRIMARY KEY (user_id),
UNIQUE KEY (user_uuid)
)
エラー
ERROR 1170 (42000) at line 102: BLOB/TEXT column 'user_uuid' used in key specification without a key length
原因
BLOB
またはTEXT型
のカラムをインデックスまたは外部キーに指定しようとした際に発生する。BLOBまたはTEXT型のカラムをインデックスとして使用する場合、サイズを指定しないといけない。
解決策
1. インデックス作成時にカラムのキー長を指定する
CREATE TABLE IF NOT EXISTS user (
user_id Integer NOT NULL COMMENT 'ユーザーID',
user_uuid text NOT NULL COMMENT 'ユーザーUUID',
user_name text NOT NULL COMMENT 'ユーザー名',
PRIMARY KEY (user_id),
UNIQUE KEY (user_uuid(32)) -- TEXT型に対してキー長を指定
)
2. TEXT型の代わりにVARCHAR型を使用する
インデックスにサイズ制限を設けなくても良くなる
CREATE TABLE IF NOT EXISTS user (
user_id Integer NOT NULL COMMENT 'ユーザーID',
user_uuid varchar(32) NOT NULL COMMENT 'ユーザーUUID',
user_name text NOT NULL COMMENT 'ユーザー名',
PRIMARY KEY (user_id),
UNIQUE KEY (user_uuid) -- TEXT型に対してキー長を指定
)
まとめ
- VARCHAR型は、サイズが固定されているため、user_uuidのサイズが32文字であることが分かっている場合は、こちらの方が一般的に適しています。
- TEXT型を使用する場合は、キー長を指定することでエラーを回避できますが、パフォーマンスの観点からもVARCHARを使用する方が良い場合が多いです。