はじめに
MySQLでテーブルを作成する際に、誤って識別子に予約語を使用してしまったため、構文エラーが発生するという体験をした。
そこで、同じミスを繰り返さないために、MySQLにおける識別子と予約語について知識を整理することにした。
識別子とは?
MySQLでは、データベースオブジェクト(データベースやテーブル、カラム)に付ける名前のことを識別子と呼ぶ。
識別子には以下のルールがある。
- アルファベット(大文字または小文字)、数字、アンダースコア(_)から構成する。
- 数字から始めることはできない。始める文字はアルファベットまたはアンダースコア(_)でなければならない。
- 大文字と小文字を区別する。つまり、
MyTable
とmytable
は異なる識別子と見なされる - 最大長は64文字。ただし、実際には使用するデータベースエンジンや設定により異なる場合がある。
- 識別子がMySQLの
予約語
と一致する場合は、その名前を使用できない。ただし、予約語をバッククォート(`)で囲むことによって、識別子として使用できる。 ※詳細については後述。
予約語とは?
予約語は、MySQLが特定の機能や操作を実行するために予め定義しているキーワードである。これらのキーワードはSQL文の構造や動作を定義し、通常、ユーザーがデータベースオブジェクト(データベースやテーブル、カラム)の名前に使用することはできない。予約語はSQLの標準的な構造を維持し、クエリを正しく解釈するために使用される。
予約語は、最新のMySQL公式ドキュメント
から確認するのがお勧めである。
※将来のバージョンで新しい予約語が導入される可能性があるため。
https://dev.mysql.com/doc/refman/8.0/ja/keywords.html
予約語を識別子として使用する場合
予約語をテーブルやカラムなどの識別子として使用する場合、バッククォート(`)で囲む必要がある。例えば、以下のように使用する。
-- 予約語を識別子として使用する例
CREATE TABLE `select` (
`from` INT,
`where` VARCHAR(255)
);
上記例では、予約語select
をテーブルの識別子として使用し、
予約語from
とwhere
をカラムの識別子として使用している。
まとめ
MySQLでは、予約語を識別子として使用すると構文エラーが発生するが、識別子をバッククォート
で囲むことによって、この問題を回避できる。
ただし、予約語はMySQLが特定の目的で予め定義しているキーワードであり、識別子として使用する場合は慎重に扱う必要がある。
個人的には、全ての予約語を覚える必要性は感じない(というかできない)が、一度最新のMySQL公式ドキュメントの予約語一覧に目を通し、雰囲気を大雑把にでも掴んでおくのが良いと感じた。