1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

MySQLエラー:ERROR 1170 (42000) at line 102: BLOB/TEXT column 'user_uuid' used in key specification without a key length

Posted at

背景

以下の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を使用する方が良い場合が多いです。
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?