SQLite | SQLite の基礎知識 | SQLite で定義されているキーワードの注意点

SQLite には多くのキーワードが定義されています。これらのキーワードは通常、テーブル名やカラム名などには使用できませんが、適切な書き方をすれば使用できる場合もあります。ここでは、SQLite で定義されているキーワードの注意点とキーワード一覧について説明します。

キーワードを識別子として使用する方法

SQLite には多くのキーワードが定義されています。後ほど一覧を示しますが、TABLESELECT などの単語はキーワードです。キーワードは予約語とも呼ばれます。

テーブル名やデータベース名は識別子と呼ばれます。識別子は、アルファベットや数字などを組み合わせて指定できます。たとえば、booktablename などは使用できます。ただし、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 のキーワードとして定義されているものを以下に示します。これは次の公式サイトに掲載されています。

SQLite Keywords

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

これらのキーワードの中には、シングルクォートやダブルクォートなどで囲まなくても識別子として使用できるものもあります。ただし、キーワードをそのまま識別子として使用するとわかりにくくなるため、あまり望ましい方法ではありません。

テーブルなどを作成するときに原因不明のエラーが発生した場合は、テーブル名やカラム名がキーワードになっていないか確認してみてください。