仕事柄データベースと連携したホームページを作ることがよくあります。
データベースの設計をして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
一見ただの文法エラーですが、記述ミスがなく四苦八苦しました。
ようやく原因を突き止めて対処することができましたので、忘備録として記録いたします。
現象はこのような感じです。
次のようなテーブルを追加しようとしたら、文法エラーになりました。
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等各種プログラム言語には命令を実行するための記述があります。
例えば次のようなものです。
- SELECT
- FROM
- WHERE
- IF
- SWITCH
- CASE
- SORT
プログラムをされる方にはなじみのキーワードです。
問題は、これらのキーワードを「任意名称」として使用するとエラーになるということです。
そりゃそうです。
命令語が書いてあったら、命令を実行します。
そのため、MYSQLのテーブルのメンバ名に予約語が記述してあったら、文法エラーとなるのです。
ちなみに予約語はかなりたくさんあります。
よい機会だったので、MYSQLの予約語がどのくらいあるのかを調べてみたところ、
思ったよりたくさんありました。
MYSQLの公式リファレンスから確認できます。
謎文法エラーが出たときは、「予約語」を疑ってみることも大事だと知りました。
良い勉強になりました。