#背景
実は前回記事より前の話。
ドットインストールMySQL入門
「#17 ENUM型を使ってみよう」にて、
説明動画とバージョンが違う環境でエラーが発生したので
記事に残します。
#開発環境
MacOS Mojave
MySQL8.0.15
#内容
学習内容は、
「ENUM型を使い、
複数の文字列の中から一つだけを選んで格納する」
というものです。
SQL文は以下の通り。
DROP TABLE IF EXISTS users;
CREATE TABLE users(
id INT unsigned PRIMARY KEY auto_increment,
name varchar(20),
score float,
rank enum('gold','silver','bronze')
);
INSERT INTO users (name,score,rank) VALUES ('taguchi',5.8,'silver');
INSERT INTO users (name,score,rank) VALUES ('fkoji',8.2,'gold');
INSERT INTO users (name,score,rank) VALUES ('dotinstall',6.1,'red');
SELECT * FROM users;
実行してみると...
mysql> \. ./myapp.sql
Query OK, 0 rows affected (0.01 sec)
Query OK, 0 rows affected (0.01 sec)
Query OK, 0 rows affected (0.01 sec)
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 'rank enum('gold','silver','bronze')
)' at line 5
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 'rank) VALUES ('taguchi',5.8,'silver')' at line 1
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 'rank) VALUES ('fkoji',8.2,'gold')' at line 1
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 'rank) VALUES ('dotinstall',6.1,'red')' at line 1
ERROR 1146 (42S02): Table 'myapp.users' doesn't exist
こいつぁ厳しい。
翻訳したら、
「SQL構文エラーですよ。まあマニュアル読めや」
って感じだったので、公式マニュアルを
読んでみましたが、
ENUM型に対して怪しい項目は見当たらず...
新バージョンのENUM型に対して検索を掛けても、
あんまりパッとした解決策は出て来ませんでした。
#発見
マニュアルを読んでいる中で、
怪しい場所を見つけました。
それは、MySQL8.0で新しく追加されたという
「ウインドウ関数」です。
どうやら、この関数の中に
RANK()
という関数があるそうで。
今回ENUM型のカラム名に使用したのが「rank」
だったので、カラム名を関数と認識されて
エラーになったみたいです。
#改善
その為、「rank」カラム名を「`」(バッククオート)で括ってみました。
DROP TABLE IF EXISTS users;
CREATE TABLE users(
id INT unsigned PRIMARY KEY auto_increment,
name varchar(20),
score float,
`rank` enum('gold','silver','bronze')
);
INSERT INTO users (name,score,`rank`) VALUES ('taguchi',5.8,'silver');
INSERT INTO users (name,score,`rank`) VALUES ('fkoji',8.2,'gold');
INSERT INTO users (name,score,`rank`) VALUES ('dotinstall',6.1,'red');
SELECT * FROM users;
実行結果は以下の通り。
ERROR 1265 (01000): Data truncated for column 'rank' at row 1
+----+---------+-------+--------+
| id | name | score | rank |
+----+---------+-------+--------+
| 1 | taguchi | 5.8 | silver |
| 2 | fkoji | 8.2 | gold |
+----+---------+-------+--------+
カラム名は「rank」のままテーブルが出来ていますね。
ENUMの中で指定が無い「red」を含んだレコードは
ERRORで弾かれていることも確認出来ました。
#結論
バージョンアップで新たに追加された機能に使用される単語は
予約語になり使用できなくなります。
何らかのバージョアップを実施した際は
こまめに更新内容をチェックしましょうね。