varchar(255) の主キーを持つテーブルがあります。255 文字では足りないケースがいくつか発生しました。フィールドをテキストに変更しようとしましたが、次のエラーが発生します。
BLOB/TEXT column 'message_id' used in key specification without a key length
これをどうすれば修正できますか?
編集: このテーブルには複数の列を持つ複合主キーがあることも指摘しておく必要があります。
ベストアンサー1
このエラーは、MySQL が BLOB または列の最初の N 文字しかインデックス付けできないために発生しますTEXT
。したがって、このエラーは主に、 または BLOB のフィールド/列タイプ、または 、 、 、 、 などの または タイプに属するフィールド/列タイプがあり、それらを使用して主キーまたはインデックスを作成しようとする場合に発生します。長TEXT
さの値が完全であるかないかにかかわらず、MySQL は可変で動的なサイズであるため、列の一意性を保証できません。したがって、またはタイプをインデックスとして使用する場合、MySQL がキーの長さを決定できるように N の値を指定する必要があります。ただし、MySQL はまたはのキーの長さ制限をサポートしていません。単に機能しません。TEXT
BLOB
TINYBLOB
MEDIUMBLOB
LONGBLOB
TINYTEXT
MEDIUMTEXT
LONGTEXT
BLOB
TEXT
BLOB
TEXT
TEXT
BLOB
TEXT(88)
また、列が既に一意制約またはインデックスとして定義されている場合に、テーブル列をandなどのnon-TEXT
and型からor型に変換しようとすると、エラーが発生します。Alter Table SQL コマンドは失敗します。non-BLOB
VARCHAR
ENUM
TEXT
BLOB
この問題の解決策は、インデックスまたは一意制約からTEXT
または列を削除するか、別のフィールドを主キーとして設定することです。それができず、または列に制限を設定したい場合は、 type を使用して長さの制限を設定してみてください。デフォルトでは、 は最大 255 文字に制限されており、その制限は宣言の直後の括弧内に暗黙的に指定する必要があります。つまり、 は200 文字の長さに制限されます。BLOB
TEXT
BLOB
VARCHAR
VARCHAR
VARCHAR(200)
TEXT
場合によっては、テーブルでまたは関連する型を使用していない場合でもBLOB
、エラー 1170 が表示されることがあります。これは、VARCHAR
列を主キーとして指定したが、その長さまたは文字サイズを誤って設定した場合などに発生します。 はVARCHAR
最大 256 文字しか受け入れないため、 などの文字はMySQL に をデータ型にVARCHAR(512)
自動変換するように強制し、その後、列が主キーまたは一意または非一意のインデックスとして使用されている場合にキーの長さに関するエラー 1170 で失敗します。この問題を解決するには、フィールドのサイズとして 256 未満の数値を指定します。VARCHAR(512)
SMALLTEXT
VARCHAR
参照:MySQL エラー 1170 (42000): キー長を指定せずにキー仕様で BLOB/TEXT 列が使用されている