はじめに

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」
ぜひ、ご活用してみてください。