名前と識別子
名前は、データベースオブジェクト (テーブルや列など) と、ユーザーおよびパスワードを識別します。名前という用語と識別子という用語は、ほとんど同じ意味で使用できます。2 種類の識別子があります。標準的な識別子と、引用符で囲まれた (すなわち、区切り記号付き) 識別子です。識別子は UTF-8 印字可能文字のみで構成する必要があります。標準的な識別子と区切り記号付き識別子の ASCII 文字は、大文字と小文字の区別がありませんが、データベースでは小文字で表記されます。クエリの結果では、列名は、デフォルトで小文字で返されます。列名を大文字で返すには、describe_field_name_in_uppercase 設定パラメータを true
に設定します。
標準的な識別子
標準的な SQL 識別子はルールセットに準拠するものであり、以下の条件を満たしている必要があります。
-
ASCII のシングルバイトのアルファベット文字または下線文字、または UTF-8 のマルチバイト文字 (2 バイトから 4 バイト) で開始します。
-
後続の文字には、ASCII のシングルバイトの英数字、下線、またはドル記号、またはマルチバイトの UTF-8 文字 (2 バイトから 4 バイト) を使用できます。
-
長さが 1~127 バイトで、区切り記号として引用符を含まない。
-
引用符とスペースは含めない。
-
予約された SQL キーワードではない。
区切り記号付き識別子
区切り記号付き識別子 (引用符で囲まれた識別子とも言う) は、二重引用符 (") で囲まれます。区切り記号付き識別子を使用する場合は、そのオブジェクトへのすべての参照で二重引用符を使用する必要があります。この識別子には、二重引用符以外の標準の UTF-8 印字可能文字を含めることができます。したがって、任意の文字列 (スペースやパーセント記号など本来なら無効な文字も含む) で列またはテーブルの名前を作成できます。
区切り記号付き識別子の ASCII 文字は、大文字と小文字の区別がありませんが、小文字で表記されます。文字列内で二重引用符を使用するには、その二重引用符の前に別の二重引用符文字を付ける必要があります。
大文字と小文字を区別する識別子
大文字と小文字を区別する識別子 (大文字と小文字が混在する識別子とも呼ぶ) には、大文字と小文字の両方を使用することができます。大文字と小文字を区別する識別子を使用するには、構成 enable_case_sensitive_identifier
を true
に設定します。この構成は、クラスターまたはセッションに対して設定できます。詳細については、「Amazon Redshift 管理ガイド」の「デフォルトパラメータ値」および「enable_case_sensitive_identifier」を参照してください。
システム列名
ただし、次の PostgreSQL システム列の名前を、ユーザー定義の列の名前として使用することはできません。詳細については、https://www.postgresql.org/docs/8.0/static/ddl-system-columns.html
oid
tableoid
xmin
cmin
xmax
cmax
ctid
例
次の表に、区切り記号付き識別子の例、結果として生じる出力、および説明を示します。
構文 | 結果 | 説明 |
---|---|---|
"group" | グループ | GROUP は予約語であるため、これを識別子の中で使用するには二重引用符が必要です。 |
"""WHERE""" | "where" | WHERE も予約語です。文字列内に引用符を含めるには、二重引用符それぞれに二重引用符を付けてエスケープします。 |
"This name" | this name | スペースを保持するために二重引用符が必要です。 |
"This ""IS IT""" | this "is it" | IS IT を囲んでいる各引用符を名前の一部とするには、その各引用符の前にそれぞれ追加の引用符を配置する必要があります。 |
this "is it" という名前の列を持つ group という名前のテーブルを作成するには、以下のように記述します。
create table "group" ( "This ""IS IT""" char(10));
次のクエリは同じ結果を返します。
select "This ""IS IT""" from "group"; this "is it" -------------- (0 rows)
select "this ""is it""" from "group"; this "is it" -------------- (0 rows)
次に示す完全に修飾された table.column
構文も同じ結果を返します。
select "group"."this ""is it""" from "group"; this "is it" -------------- (0 rows)
次の CREATE TABLE コマンドは、列名にスラッシュを含むテーブルを作成します。
create table if not exists city_slash_id( "city/id" integer not null, state char(2) not null);