SQLエラーについて、対処方法や原因の調べ方についてまとめています。
SQLエラーの対処方法
SQLエラー「あいまい(ambiguous)です」
複数テーブルをjoinしている場合、同じカラム名を持つテーブルがあるときに発生するエラーです。
mysql> SELECT emp_no, first_name, last_name, dept_name -> FROM employees ,dept_emp,departments -> where employees.emp_no = dept_emp.emp_no -> and departments.dept_no = dept_emp.dept_no -> limit 10; ERROR 1052 (23000): Column 'emp_no' in field list is ambiguous SELECT employees.emp_no, first_name, last_name, dept_name FROM employees ,dept_emp,departments where employees.emp_no = dept_emp.emp_no and departments.dept_no = dept_emp.dept_no limit 10; +--------+-------------+-------------+------------------+ | emp_no | first_name | last_name | dept_name | +--------+-------------+-------------+------------------+ | 10011 | Mary | Sluis | Customer Service | | 10038 | Huan | Lortz | Customer Service | | 10049 | Basil | Tramer | Customer Service | | 10060 | Breannda | Billingsley | Customer Service | | 10088 | Jungsoon | Syrzycki | Customer Service | | 10098 | Sreekrishna | Servieres | Customer Service | | 10112 | Yuichiro | Swick | Customer Service | | 10115 | Chikara | Rissland | Customer Service | | 10126 | Kayoko | Valtorta | Customer Service | | 10128 | Babette | Lamba | Customer Service | +--------+-------------+-------------+------------------+ 10 rows in set (0.19 sec)
上記の例では「emp_noって、employeesテーブルにもdept_empテーブルにも存在するカラム名だけどどちらのことを指しているの?指定があいまいだよ」というエラーになります。
対処方法は、「あいまいだ」と指摘されたカラムにemployees.emp_noとテーブル名指定をすればOKです。
SQLエラー「syntax(文法) error at ~or near …」
ふだん、もっとも多く目にするのがsyntax(文法)エラーでしょう。
しかし、どう見ても文法的に間違っていないのにsyntax errorが出るというケースがあります。
下記の例は、asで指定したカラム名「left」が予約後だったために起こったエラーです。予約後以外を使うか、バッククォート(「`」)を使うことで対処しました。
mysql> select emp_no as left from employees limit 10; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'left from employees limit 10' at line 1 mysql> select emp_no as `left` from employees limit 10; +-------+ | left | +-------+ | 10001 | | 10002 | | 10003 | | 10004 | | 10005 | | 10006 | | 10007 | | 10008 | | 10009 | | 10010 | +-------+ 10 rows in set (0.00 sec)
複雑なSQLクエリでは、カッコの対応などが一見してわからないケースもあります。
整形ツールにクエリを入力して、見やすい状態に整えてからカッコ対応やカンマの抜けなどをチェックするとエラー箇所を発見しやすいと思います。
【関連記事】
▶SQL formatter オンラインで使える無料整形ツール 3選
文法が合っているのにsyntaxエラーが出るケースは多く、原因がわからなくてハマることも多いです。エラーメッセージに、どのキーワード周辺でエラーが発生しているかがわかるので、「mysql syntax error left」などのワードで検索して、原因を探しましょう。
SQLエラーコードで検索する
mysql> select * from employee; ERROR 1146 (42S02): Table 'employees.employee' doesn't exist mysql> select * from employees limit 10; +--------+------------+------------+-----------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-----------+--------+------------+ | 10001 | 1953-09-02 | xGeorgi | Facello | M | 1986-06-26 | | 10002 | 1964-06-02 | Bezalel | Simmel | F | 1985-11-21 | | 10003 | 1959-12-03 | Parto | Bamford | M | 1986-08-28 | | 10004 | 1954-05-01 | Chirstian | Koblick | M | 1986-12-01 | | 10005 | 1955-01-21 | Kyoichi | Maliniak | M | 1989-09-12 | | 10006 | 1953-04-20 | Anneke | Preusig | F | 1989-06-02 | | 10007 | 1957-05-23 | Tzvetan | Zielinski | F | 1989-02-10 | | 10008 | 1958-02-19 | Saniya | Kalloufi | M | 1994-09-15 | | 10009 | 1952-04-19 | Sumant | Peac | F | 1985-02-18 | | 10010 | 1963-06-01 | Duangkaew | Piveteau | F | 1989-08-24 | +--------+------------+------------+-----------+--------+------------+ 10 rows in set (0.00 sec)
エラーメッセージの先頭にERROR 1146 (42S02)と表示されています。MySQLの場合、ERROR直後の数字がエラーコード、カッコ内がエラーステートです。
「MySQL 1146」などでネット検索して原因を探しましょう。
上記の場合は、employeesをemployeeとタイプミスしたのが原因で「指定のテーブルが存在しない」エラーとなっています。
また、エラーメッセージそのものをコピペしてネット検索するのも有効です。
まとめ
- あいまい(ambiguous)エラーは、テーブル名を明示することで対処する。
- syntax errorは、文法以外の原因でも発生する可能性がある。
- エラーの対処方法を探すには、エラーコードをネット検索すると効率的。