皆さんは普段テーブルを作成する時にどのように作っているでしょうか? 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を使って作成する場合は,
そしてツールから作ったは良いものの,
そういったことが続くようであれば,