テーブルにインデックスを定義します。
Synopsis
CREATE [UNIQUE | BITMAP] INDEX index-name
 ON [TABLE] table-name (column-name [ASC | DESC], ...)
引数
UNIQUE インデックス内のすべての列で、テーブル内に同じ値を持つ行がないことを保証する制約
BITMAP ビットマップ・インデックスの生成を表します
index-name 定義されるインデックス。識別子 の名前です。
table-name インデックスが定義される既存のテーブル名
column-name インデックスの基準となる、1 つまたは複数の の名前
ASC このキーワードは何も実行しません。解析時に、他のベンダに対する互換性保持のためにのみサポートされます。
DESC このキーワードは何も実行しません。解析時に、他のベンダに対する互換性保持のためにのみサポートされます。
概要
CREATE INDEX 節は、指定したテーブルの指定した列でソートされたインデックスを作成します。インデックスを作成するには、ユーザ定義内のテーブル・アクセスに対して、ALTER 特権が必要です。
インデックス名は、指定されたテーブル内では一意の必要があります。インデックス名は、識別子規約に従い、以下の制限を受けます。既定のインデックス名は、簡単な識別子です。インデックス名は、128 文字を超えることはできません。
Caché は、入力された名前 (“SqlName” と呼ばれる) を使用して、対応するインデックス名を生成します。インデックス名には英数字 (文字と数字) のみを使用でき、最大長は 31 文字です。Caché は、まず入力された名前から句読点を削除し、31 文字 (未満) の一意の識別子を生成して、一意のインデックス名の生成に必要であれば 31 番目の文字を大文字に置き換えてインデックス名を生成します。
既存インデックスと同じ名前のインデックスを作成する場合に何が起こるかは、以下に説明しています。
既存インデックス
テーブルに既存のインデックスと同じ名前のインデックスを作成しようとしたときにどうなるかは、Caché 構成マネージャの設定によって異なります。[詳細] タブの [SQL] オプションで、[既存インデックスに対して DDL CREATE INDEX を許可する] の現在の値を表示します。既定は “いいえ” です。既定で Caché は、テーブルに既存インデックスと同じ名前のインデックスを作成することを拒否し、SQLCODE -324 エラーを返します。ここでは、この設定を推奨します。
このオプションを “はい” に設定した場合、Caché はクラス定義から既存インデックスを削除して、CREATE INDEX を実行して再作成します。CREATE INDEX で指定されたテーブルから、指定されたインデックスを削除します。このオプションにより、UNIQUE 制約インデックスの削除/再作成が可能になります (DROP INDEX コマンドでは実行できません)。主キー・インデックスの削除/再作成は、"ALTER TABLE" コマンドを参照してください。
ただし、このオプションが既存インデックスの再作成を許可するように設定されていても、テーブルにデータが格納されている場合は、IDKEY インデックスの再作成はできません。これを実行しようとすると、SQLCODE -324 エラーが返されます。
UNIQUE キーワード
UNIQUE キーワードを使用して、インデックス内の各レコードが一意の値を持つよう指定できます。具体的には、インデックス内に (つまり、インデックスがあるテープル内に) 同じ 照合された 値を持つレコードは存在しないよう指定できます。既定では、大半のインデックスは、(大文字小文字に関係なく検索するように) 大文字の照合を使用します。この場合、“Smith”“SMITH” は等しい値であり、それぞれ一意的ではありません。
BITMAP キーワード
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)
関連項目
DROP INDEX