皆さんは普段テーブルを作成する時にどのように作っているでしょうか? SQLでテーブルを作成している場合もあれば、
今回は、
検証環境
今回はdockerで建てたMySQLを使用します。以下のコマンドでdockerを建ててローカルからアクセスをします。
% docker run --platform linux/x86_64 -p 3307:3306 -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:latest % % mysql -uroot -pmy-secret-pw
執筆時点では、
mysql> select version(); +-----------+ | version() | +-----------+ | 8.0.28 | +-----------+ 1 row in set (0.01 sec)
今回のテスト用に、
mysql> create database test; mysql> use test
キーワードや予約語と衝突するテーブルを作ってみる
まずはキーワードや予約語と衝突するテーブルを作ってみましょう。今回は、
create文は以下のものになります。一応、
mysql> create table test(id int); Query OK, 0 rows affected (0.09 sec) mysql> create table select(id int); 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 'select(id int)' at line 1
testテーブルは作成できましたが、
でも、
mysql> create table `select`(id int); Query OK, 0 rows affected (0.10 sec) mysql> show tables ; +----------------+ | Tables_in_test | +----------------+ | select | | test | +----------------+ 2 rows in set (0.03 sec)
今度はクエリが実行されてselectテーブルが作成されていることがわかります。では、
答は簡単で、
mysql> select * from select; 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 'select' at line 1
DMLで先ほど作成したテーブルに対してselect文を実行しようとしたら、
mysql> select * from `select`; Empty set (0.07 sec)
今度は実行できました。このように、
selectテーブルは、
部のクエリビルダやマイグレーションツールでは、
キーワードと予約語を調べる
キーワードと予約語の調べ方ですが、
もう1つ、
mysql> select * from information_schema.KEYWORDS;
実行すると、
+----------------------------------------+----------+ | WORD | RESERVED | +----------------------------------------+----------+ | ACCESSIBLE | 1 | | ACCOUNT | 0 | ~省略~ | XOR | 1 | | YEAR | 0 | | YEAR_MONTH | 1 | | ZEROFILL | 1 | | ZONE | 0 | +----------------------------------------+----------+ 747 rows in set (0.04 sec)
WORDがキーワードと予約語の文字列になります。RESERVEDが1のものが予約語を表していて、
簡単にgroup byを取って数えてみましたが、
mysql> select RESERVED, count(*) from information_schema.KEYWORDS group by RESERVED; +----------+----------+ | RESERVED | count(*) | +----------+----------+ | 1 | 261 | | 0 | 486 | +----------+----------+ 2 rows in set (0.05 sec)
RESERVEDに入ってる単語から、
まとめ
今回は、
自分がSQLを使って作成する場合は、
そしてツールから作ったは良いものの、
そういったことが続くようであれば、