テーブルにインデックスを定義します。
Synopsis
CREATE [UNIQUE | BITMAP] INDEX index-name
ON [TABLE] table-name (column-name [ASC | DESC], ...)
CREATE INDEX 節は、指定したテーブルの指定した列でソートされたインデックスを作成します。インデックスを作成するには、ユーザ定義内のテーブル・アクセスに対して、ALTER 特権が必要です。
インデックス名は、指定されたテーブル内では一意の必要があります。インデックス名は、
識別子規約に従い、以下の制限を受けます。既定のインデックス名は、簡単な識別子です。インデックス名は、128 文字を超えることはできません。
Caché は、入力された名前 (SqlName と呼ばれる) を使用して、対応するインデックス名を生成します。インデックス名には英数字 (文字と数字) のみを使用でき、最大長は 31 文字です。Caché は、まず入力された名前から句読点を削除し、31 文字 (未満) の一意の識別子を生成して、一意のインデックス名の生成に必要であれば 31 番目の文字を大文字に置き換えてインデックス名を生成します。
-
インデックス名は、フィールド、テーブル、ビューと同じ名前にすることができますが、このような名前の重複はお勧めできません。
-
インデックス名には、最低でも 1 字は英字が必要です。インデックス名の先頭の字または最初の句読点の後ろの字は、文字にする必要があります。有効な文字は、
$ZNAME テストに合格する文字です。
-
生成されたインデックス名には句読点が含まれないため、句読点のみが異なるインデックス名の作成は可能ですがお勧めできません。
-
インデックス名は 31 文字よりも大幅に長くすることができますが、最初の 31 文字の英数字と異なるインデックス名にすると処理が大幅に簡素化されます。
既存インデックスと同じ名前のインデックスを作成する場合に何が起こるかは、以下に説明しています。
テーブルに既存のインデックスと同じ名前のインデックスを作成しようとしたときにどうなるかは、
Caché 構成マネージャの設定によって異なります。[詳細] タブの [SQL] オプションで、
[既存インデックスに対して DDL CREATE INDEX を許可する] の現在の値を表示します。既定は いいえ です。既定で Caché は、テーブルに既存インデックスと同じ名前のインデックスを作成することを拒否し、SQLCODE -324 エラーを返します。ここでは、この設定を推奨します。
このオプションを はい に設定した場合、Caché はクラス定義から既存インデックスを削除して、
CREATE INDEX を実行して再作成します。
CREATE INDEX で指定されたテーブルから、指定されたインデックスを削除します。このオプションにより、UNIQUE 制約インデックスの削除/再作成が可能になります (
DROP INDEX コマンドでは実行できません)。主キー・インデックスの削除/再作成は、"
ALTER TABLE" コマンドを参照してください。
ただし、このオプションが既存インデックスの再作成を許可するように設定されていても、テーブルにデータが格納されている場合は、IDKEY インデックスの再作成はできません。これを実行しようとすると、SQLCODE -324 エラーが返されます。
UNIQUE キーワードを使用して、インデックス内の各レコードが一意の値を持つよう指定できます。具体的には、インデックス内に (つまり、インデックスがあるテープル内に) 同じ
照合された 値を持つレコードは存在しないよう指定できます。既定では、大半のインデックスは、(大文字小文字に関係なく検索するように) 大文字の照合を使用します。この場合、
Smith と
SMITH は等しい値であり、それぞれ一意的ではありません。
BITMAP キーワードを使用する場合、このインデックスは、ビットマップ・インデックスであることを指定できます。ビットマップ・インデックスは、ビットマップ (圧縮 2 進数) でインデックスされた値に対応し、行の ID リストを維持します。SQL クエリ・プロセッサは、セット演算を使用して制限を実行するビットマップ・インデックスを利用できます。このため、AND と OR 論理演算子を使用して、(
WHERE 節の) テーブル制限を実行できます。これは、INSERT、UPDATE、DELETE 演算子をビットマップで実行するか通常のインデックスで実行するかでは大差ありません。ビットマップ・インデックスは、既定構造 (
%CacheStorage) を使用するテーブルに対してのみ定義でき、システムが割り当てた数値列 ID (例えば、IDKEY 機能を使用しないなど) を持ちます。テーブルの作成に (クラス定義の使用と反対に) DDL を使用する場合、これらの要件に合致し、ビットマップ・インデックスを有効に利用できます。
以下の埋め込み SQL の例では、Fred という名前のテーブルを作成してから、Fred テーブルの
Lastword 列と
Firstword 列に対して (入力された名前 Fred_Index から句読点を削除して) FredIndex というインデックスを作成します。
SET %msql="_SYSTEM"
&sql(CREATE TABLE Fred (
TESTNUM INT NOT NULL,
FIRSTWORD CHAR (30) NOT NULL,
LASTWORD CHAR (30) NOT NULL,
CONSTRAINT FredPK PRIMARY KEY (TESTNUM))
)
IF SQLCODE=0 { WRITE !,"Table created" }
ELSEIF SQLCODE=-201 { WRITE !,"Table already exists" }
ELSE { WRITE !,"SQL table create error code is: ",SQLCODE
QUIT }
&sql(CREATE INDEX Fred_Index
ON TABLE Fred
(LASTWORD,FIRSTWORD))
IF SQLCODE=-324 {
WRITE !,"Index already exists"
QUIT }
ELSEIF SQLCODE=0 { WRITE !,"Index created" }
ELSE { WRITE !,"SQL index create error code is: ",SQLCODE
QUIT }
以下の例は、Staff テーブルの
City 列に対して、CityIndex という名前のインデックスを作成します。
CREATE INDEX CityIndex ON Staff (City)
以下の例は、Staff テーブルの
EmpName 列に対して、EmpIndex という名前のインデックスを作成します。列内に同一の値を持つ行を避けるために、UNIQUE 制約を使用します。
CREATE UNIQUE INDEX EmpIndex ON TABLE Staff (EmpName)
以下の例は、Purchase テーブルの
SKU 列に対して、SKUIndex という名前のビットマップ・インデックスを作成します。BITMAP キーワードは、コードがビットマップ・インデックスであることを示します。
CREATE BITMAP INDEX SKUIndex ON TABLE Purchases (SKU)