はじめに
MSPチームのまっちゃんです。
Amazon RDS for MySQL 5.7から8.0へのアップグレードで発生する可能性のあるエラーの一つに、予約語との競合があります。
MySQL 8.0では、以前のバージョンと比較して予約語が増えたため、テーブル名やカラム名などが新しい予約語と競合し、エラーが発生するケースがあります。
本記事では、予約語との競合によるエラーが発生する原因と解決策について解説します。
原因
MySQL 8.0では、新しい予約語が追加されました。
これにより、新しい予約語と名前が競合する既存のデータベースオブジェクト(テーブル、カラム、インデックスなど)は使用できなくなります。
エラー文
データベース名.テーブル名.rank - Column name
上記の場合は、カラム名の「rank」が競合しているためエラーが出力されています。
競合していた文字
私が対応した中で、競合していた文字は以下になります。
その他にも多数追加されておりますので、以下リンクの[競合している予約語一覧]をご確認ください!
RANK ROW
解決策
競合しているカラム名を【abcde】や【abcde_〇〇】のように単体でその文字を使用せずに別名やアンダーバーを用いることで回避ができます。
解決方法
エラーログにて、対象のカラムを特定した上での対応となります。
- 対象のデータベースを選択
USE [datebase_name];
※[datebase_name]は該当のデータベース名に変更して実施をしてください。
- 選択されていることを確認
SELECT database();
- 予約語と名前が競合するオブジェクトをデータベースごとに特定
SELECT TABLE_NAME, COLUMN_NAME, data_type FROM INFORMATION_SCHEMA.COLUMNS WHERE (COLUMN_NAME LIKE '%競合名%' OR COLUMN_NAME LIKE '%競合名%' OR COLUMN_NAME LIKE '%競合名%') AND TABLE_SCHEMA = '[datebase_name]';
※[datebase_name]は該当のデータベース名に変更して実施をしてください。
- 競合するオブジェクト名をカラムごとに修正
ALTER TABLE [table_name] CHANGE [old_column_name] [new_column_name] data_type;
※[table_name]は該当のテーブル名に変更して実施をしてください。
※[old_column_name]は変更前のカラム名を入力してください。
※[new_column_name]は変更後のカラム名を入力してください。
まとめ
データベース内の情報を変更するため、慎重に進める必要があります。
それに伴い、サイト内とデータベース内で競合している箇所を特定することで、修正箇所がより明確になります。
競合箇所を特定する際にサイト内では、ページ内検索をすることで効率的に進められるかと思います。
Windowsであれば「ctrl +F +V」
Macであれば、「command (⌘) +F +V」
ぜひ、ご活用してみてください。