MYSQLテーブル追加ででた謎のsyntaxエラーに対処

仕事柄データベースと連携したホームページを作ることがよくあります。
データベースの設計をしてMYSQLにテーブルを作成します。

いつものことといえば、いつものことです。

ところが今回下記のようなエラーが発生しました。

  • You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ‘group text, primary key(data_no) )’ at line 5

一見ただの文法エラーですが、記述ミスがなく四苦八苦しました。
ようやく原因を突き止めて対処することができましたので、忘備録として記録いたします。

現象はこのような感じです。

次のようなテーブルを追加しようとしたら、文法エラーになりました。

文法エラーは、カンマが無いとか、カッコの数があっていないなど明らかな記述ミスで起こります。
しかし、どこにも記述ミスがありません。

原因は意外なところにありました。

ググっても、ググっても出てくるのは文法ミスのことばかり…。
そりゃそうです。syntaxエラーってそういうものです。

文法ミスは見つからない。
エラーの手掛かりをググっても見つけられない。

そんな時に、ふと違和感を感じました。

それがこちらです。

MYSQLの「group」ってどこかで見たことあるような・・

ぼんやりと記述を見ていたところ、何か違和感を感じました。
それがこちらです。

グループの名前を入れるために、メンバ名を「group」と安易にいれていました。
でも「group」ってなにかどこかで見たことがあります。

と思っていたら、気づきました。

SELECT * FROM テーブル名 GROUP BY グループ名;

そうです。
SELECT文に使うグルーピングの命令語です。

予約語をメンバ名に使用していたため、文法エラーになっていました。
蓋を開けたらこんなことかぁ。

な事例でした。

次のように直したら文法エラーが消えました。

原因はメンバ名に「group」という予約語を記述していたからです。
なので、「group_name」という名称に変更しました。

メンバ名には、予約語を含んでいても完全一致でなければセーフです。

メンバ名の記述を変えたことで文法エラーが発生しなくなりました。

疑問:予約語ってなに?

MYSQLに限らず、PHP等各種プログラム言語には命令を実行するための記述があります。

例えば次のようなものです。

  • SELECT
  • FROM
  • WHERE
  • IF
  • SWITCH
  • CASE
  • SORT

プログラムをされる方にはなじみのキーワードです。
問題は、これらのキーワードを「任意名称」として使用するとエラーになるということです。

そりゃそうです。
命令語が書いてあったら、命令を実行します。
そのため、MYSQLのテーブルのメンバ名に予約語が記述してあったら、文法エラーとなるのです。

ちなみに予約語はかなりたくさんあります。

よい機会だったので、MYSQLの予約語がどのくらいあるのかを調べてみたところ、
思ったよりたくさんありました。

MYSQLの公式リファレンスから確認できます。

謎文法エラーが出たときは、「予約語」を疑ってみることも大事だと知りました。
良い勉強になりました。

今回のレポートは以上です。
読んでいただいてありがとうございました。


ホームページに関するお悩み事やご相談事がございましたら私どもまでご連絡ください。 鋭意ご対応申し上げます。
ホームページのご提案もさせていただいております