SQLite | SQLite の基礎知識 | SQLite で定義されているキーワードの注意点
SQLite には多くのキーワードが定義されています。これらのキーワードは通常、テーブル名やカラム名などには使用できませんが、適切な書き方をすれば使用できる場合もあります。ここでは、SQLite で定義されているキーワードの注意点とキーワード一覧について説明します。
キーワードを識別子として使用する方法
SQLite には多くのキーワードが定義されています。後ほど一覧を示しますが、TABLE や SELECT などの単語はキーワードです。キーワードは予約語とも呼ばれます。
テーブル名やデータベース名は識別子と呼ばれます。識別子は、アルファベットや数字などを組み合わせて指定できます。たとえば、booktable や name などは使用できます。ただし、SQLite のキーワードはそのまま識別子として使用できません。たとえば、select をテーブル名として使用しようとするとエラーが発生します。
create table select(id, name);
sqlite> create table select(id, name);
Error: near "select": syntax error
sqlite>
キーワードをテーブル名やデータベース名などに使用することは、できるだけ避けたほうがよいでしょう。ただし、何らかの理由でキーワードを識別子として使用する必要がある場合は、次の4つの方法のいずれかを使用します。
'keyword'
"keyword"
[keyword]
`keyword`
キーワードをシングルクォート (') で囲むと文字列値として処理されます。識別子を書くべき場所にシングルクォートで囲んだ文字列値を書くと識別子として処理されるため、次のように指定できます。
create table 'select'(id, name);
sqlite> create table 'select'(id, name);
sqlite>
キーワードをダブルクォート (")、角括弧 ([])、バッククォート (`) で囲んだ場合は識別子として処理されます。また、文字列を書くべき場所にダブルクォートで囲んだ識別子を書くと文字列として処理されます。
create table "select"(id, name);
sqlite> create table "select"(id, name);
Error: table "select" already exists
sqlite> drop table 'select';
sqlite> create table "select"(id, name);
sqlite>
角括弧は Access や SQL Server で使用される方式で、バッククォートは MySQL で使用される方式です。この2つの方式は、それぞれのデータベースとの互換性のために用意されています。そのため、通常はシングルクォートまたはダブルクォートを使用します。
キーワード一覧
SQLite のキーワードとして定義されているものを以下に示します。これは次の公式サイトに掲載されています。
| ABORT | ACTION | ADD | AFTER | ALL |
|---|---|---|---|---|
| ALTER | ANALYZE | AND | AS | ASC |
| ATTACH | AUTOINCREMENT | BEFORE | BEGIN | BETWEEN |
| BY | CASCADE | CASE | CAST | CHECK |
| COLLATE | COLUMN | COMMIT | CONFLICT | CONSTRAINT |
| CREATE | CROSS | CURRENT | CURRENT_DATE | CURRENT_TIME |
| CURRENT_TIMESTAMP | DATABASE | DEFAULT | DEFERRABLE | DEFERRED |
| DELETE | DESC | DETACH | DISTINCT | DO |
| DROP | EACH | ELSE | END | ESCAPE |
| EXCEPT | EXCLUSIVE | EXISTS | EXPLAIN | FAIL |
| FILTER | FOLLOWING | FOR | FOREIGN | FROM |
| FULL | GLOB | GROUP | HAVING | IF |
| IGNORE | IMMEDIATE | IN | INDEX | INDEXED |
| INITIALLY | INNER | INSERT | INSTEAD | INTERSECT |
| INTO | IS | ISNULL | JOIN | KEY |
| LEFT | LIKE | LIMIT | MATCH | NATURAL |
| NO | NOT | NOTHING | NOTNULL | NULL |
| OF | OFFSET | ON | OR | ORDER |
| OUTER | OVER | PARTITION | PLAN | PRAGMA |
| PRECEDING | PRIMARY | QUERY | RAISE | RANGE RECURSIVE |
| REFERENCES | REGEXP | REINDEX | RELEASE | RENAME |
| REPLACE | RESTRICT | RIGHT | ROLLBACK | ROW |
| ROWS | SAVEPOINT | SELECT | SET | TABLE |
| TEMP | TEMPORARY | THEN | TO | TRANSACTION |
| TRIGGER | UNBOUNDED | UNION | UNIQUE | UPDATE |
| USING | VACUUM | VALUES | VIEW | VIRTUAL |
| WHEN | WHERE | WINDOW | WITH | WITHOUT |
これらのキーワードの中には、シングルクォートやダブルクォートなどで囲まなくても識別子として使用できるものもあります。ただし、キーワードをそのまま識別子として使用するとわかりにくくなるため、あまり望ましい方法ではありません。
テーブルなどを作成するときに原因不明のエラーが発生した場合は、テーブル名やカラム名がキーワードになっていないか確認してみてください。