LoginSignup
10
1

More than 3 years have passed since last update.

MySQL8.0における「rank」について

Posted at

背景

実は前回記事より前の話。

ドットインストールMySQL入門
「#17 ENUM型を使ってみよう」にて、
説明動画とバージョンが違う環境でエラーが発生したので
記事に残します。

開発環境

MacOS Mojave
MySQL8.0.15

内容

学習内容は、
「ENUM型を使い、
 複数の文字列の中から一つだけを選んで格納する」
というものです。

SQL文は以下の通り。

myapp.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」カラム名を「`」(バッククオート)で括ってみました。

myapp.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;

実行結果は以下の通り。

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で弾かれていることも確認出来ました。

結論

バージョンアップで新たに追加された機能に使用される単語は
予約語になり使用できなくなります。

何らかのバージョアップを実施した際は
こまめに更新内容をチェックしましょうね。

参考文献

ドットインストールMySQL入門
「#17enum型を使ってみよう」

MySQL公式マニュアル:Window関数について

10
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
1