MySQL8.0.11からNO_TABLE_OPTIONSが削除されていた

上記のツイートで知りました。

NO_TABLE_OPTIONSが削除されたVerのリリースノートは以下です。

docs.oracle.com

NO_TABLE_OPTIONSとは

SHOW CREATE TABLE の出力で MySQL 固有のテーブルオプション (ENGINE など) を出力しません。このモードはポータビリティモードで mysqldump によって使用されます。 ( MySQL 5.6 リファレンスより )

SHOW CREATE TABLE はテーブル定義をDDLで出力するコマンドです。例えば SHOW CREATE TABLE により以下のようなDDLが出力されたとします。

CREATE TABLE `users` (
  `id` int NOT NULL AUTO_INCREMENT,
  `username` varchar(50) NOT NULL,
  `password` varchar(50) NOT NULL,
  `email` varchar(355) NOT NULL COMMENT 'ex. user@example.com',
  `created` timestamp NOT NULL,
  `updated` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `username` (`username`),
  UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB AUTO_INCREMENT=100 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='Users table'

NO_TABLE_OPTIONSの説明にある MySQL 固有のテーブルオプション というのは上記DDLENGINE=InnoDB AUTO_INCREMENT=100 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='Users table' の部分だと認識しています(間違っていたらごめんなさい)。

この中で AUTO_INCREMENT=100 というオプションはAUTO INCREMENTのスタートを指定するものなのですが、この 100 という値はテーブルにレコードが追加されていく度に動的に変化する(インクリメントされていく)値になります。

上記の挙動の何が困るのかというと「動的に変化する」というところで、実テーブルのスキーマとドキュメントの差分によってCIを回したりするtblsでは「運用しているテーブルだと毎回差分が発生してしまう」という現象が発生してしまいます。

そして、その回避策として NO_TABLE_OPTIONS の利用を推奨していました。

そしてその回避策もとれない状況になったわけです。

NO_TABLE_OPTIONSがなくなった今、tblsの対応

結局tbls v1.39.0からデフォルトでTable Definitionに出力されるDDLのAUTO_INCREMENTの値だけを消すことにしました。

具体的にはv1.39.0から以下のように出力されます。

CREATE TABLE `users` (
  `id` int NOT NULL AUTO_INCREMENT,
  `username` varchar(50) NOT NULL,
  `password` varchar(50) NOT NULL,
  `email` varchar(355) NOT NULL COMMENT 'ex. user@example.com',
  `created` timestamp NOT NULL,
  `updated` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `username` (`username`),
  UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB AUTO_INCREMENT=[Redacted by tbls] DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='Users table'

もしAUTO_INCREMENTの値もそのまま表示したいときは、DSNのクエリストリングに ?show_auto_increment=1 を追加してください。

「デフォルトで消す」設定にした理由は「tblsがCIで利用するためのツールである」という点に重きを置いたからです。

というわけで

今後ともよろしくお願いします。