[MySQL]Row size too large (> 8126).エラーについて

TEXT型カラムが大量にあるテーブルに対して、データを入れる際に

Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help

というようなエラーが出てしまう場合。

原因は、一つのテーブルにカラムが多すぎです。正確にはインデックスレコードの使い過ぎ。のようです。
とくに、長いVARCHRAやTEXT型テーブルはインデックスレコードを使いまくるためです。
可変長カラムは先頭768バイトが使われるので、長いカラムが11個以上あるとエラーになってくる可能性があります。

回避策
その1 テーブルを分けろ
表題の通りです…。テーブルを分けるのが最善の策です。
パフォーマンスも一番良いはずです。

その2 フォーマットを変える
エラーメッセージにある通りROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSEDに変更すればいい。
なのですが、サーバーの設定変更も必要な場合があります。
my.cnf

[mysqld]
innodb_file_format = Barracuda
innodb_file_per_table = 1
innodb_large_prefix

共有サーバーなどで設定が変更できない場合はむりです。
phpmyadminでやるのであれば
テーブルを選択して操作の画面のテーブルオプションのセクションにある、ROW_FORMATが該当しますが、
ここにDYNAMICなどの選択肢がない場合はあきらめましょう。

その3 エンジンを変える
最後の手段として、制限が緩いDBエンジンに変更する方法。
MyISAMにすれば64K(バージョンによって変わるかもしれませんが)まで行けるようです。
トランザクションを使わないなど、innodbにこだわりがなければMyISAMにしてしまうのがとりあえず簡単な回避策になるかと思います。

MySQL徹底入門 第4版 MySQL 8.0対応
MySQL徹底入門 第4版 MySQL 8.0対応
タイトルとURLをコピーしました