ホームページ制作 オフィスオバタ

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

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

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

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

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

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

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

CREATE TABLE test_tabel
(
data_no		int unsigned not null auto_increment,
name		text,
group		text,
primary key(data_no)
)

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

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

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

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

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

それがこちらです。

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

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

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

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

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

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

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

な事例でした。

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

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

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

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

疑問:予約語ってなに?

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

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

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

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

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

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

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

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

モバイルバージョンを終了