識別子とキーワード
SQLiteでは多くのキーワードが定義されています。例えばTABLEやSELECTといった言葉はキーワードです。キーワードは予約語とも呼ぶ場合があります。
テーブル名やデータベース名は識別子と呼ばれます。識別子にはアルファベットや数字などを組み合わせて付けることができます。(例えば「booktable」や「name」など)。ただしキーワードはそのままでは識別子として使用することができません。
キーワードを識別子と使用したい場合には、次の4つのいずれかの方法を使います。
'keyword' "keyword" [keyword] `keyword`
シングルクオーテーション(')でキーワードを囲った場合、文字列の値として扱われます。識別子を記述すべきところにシングルクオーテーションで囲んだ文字列の値を記述すると識別子として扱われるためこの形式でも指定することができます。
ダブルクオーテーション(")、角括弧([])、グレイヴ・アクセント(`)でキーワードを囲った場合、識別子として扱われます。(なお文字列を記述すべきところにダブルクオーテーションで囲んだ識別子を記述すると文字列として扱われます)。
なお角括弧はAccessやSQL Serverで使われている方式でグレイブ・アクセントはMySQLで使われている方式です。この2つの方式はそれぞれのデータベースとの互換性を保つために用意されています。
以上のことからキーワードを識別子として使用するにはダブルクオーテーション(")で囲むようにしておけばいいかと思います。
キーワードの一覧
キーワードを識別子として使用するための方法を記載してきましたが、SQLiteでは多くのキーワードでクォートしなくても使用できるようになっています。
例えば「TEMP」はキーワードの一つですが、クォートしなくてもテーブル名として使用することができます。
ただクォートしないで使用すると分かりにくくなり不要な間違いを起こしかねません。またそれ以前の問題としてキーワードを識別子としてあまり使用しない方が望ましいと思います。
下記にキーワードの一覧を記載します。必ずクォートが必要なキーワードと、必要でないキーワードに分けて記載します。
クォートが必須のキーワード:
ADD ALL ALTER AND AS AUTOINCREMENT BETWEEN CASE CHECK COLLATE COMMIT CONSTRAINT CREATE CROSS DEFAULT DEFERRABLE DELETE DISTINCT DROP ELSE ESCAPE EXCEPT EXISTS FOREIGN FROM FULL GROUP HAVING IN INDEX INNER INSERT INTERSECT INTO IS ISNULL JOIN LEFT LIMIT NATURAL NOT NOTNULL NULL ON OR ORDER OUTER PRIMARY REFERENCES RIGHT ROLLBACK SELECT SET TABLE THEN TO TRANSACTION UNION UNIQUE UPDATE USING VALUES WHEN WHERE
クォートが不要のキーワード:
ABORT AFTER ANALYZE ASC ATTACH BEFORE BEGIN BY CASCADE CAST COLUMN CONFLICT CURRENT_DATE CURRENT_TIME CURRENT_TIMESTAMP DATABASE DEFERRED DESC DETACH EACH END EXCLUSIVE EXPLAIN FAIL FOR GLOB IF IGNORE IMMEDIATE INDEXED INITIALLY INSTEAD KEY LIKE MATCH OF OFFSET PLAN PRAGMA QUERY RAISE REGEXP REINDEX RELEASE RENAME REPLACE RESTRICT ROW SAVEPOINT TEMP TEMPORARY TRIGGER VACUUM VIEW VIRTUAL
システムで使っている識別子
下記の識別子はキーワードではありませんが、SQLiteシステムが使用している識別子です。他のテーブル名などに識別子として使うことも可能なようですが、使用しないほうがいいと思われます。
_ROWID_ MAIN OID ROWID SQLITE_MASTER SQLITE_SEQUENCE SQLITE_TEMP_MASTER TEMP