Hitachi

ノンストップデータベース HiRDB Version 9 SQLリファレンス


3.17.1 CREATE TABLEの形式と規則

〈この項の構成〉

(1) 機能

表を定義します。

(2) 使用権限

スキーマを所有するユーザ

RDエリア利用権限のある私用RDエリア,又は公用RDエリアに表を定義できます。

(3) 形式

CREATE 〔〔SHARE〕FIX〕〔GLOBAL TEMPORARY〕 TABLE
  〔認可識別子.〕表識別子
  (表要素〔,表要素〕…)
  〔{IN{表格納用RDエリア名
      |(表格納用RDエリア名)
      |(〔(表格納用RDエリア名)格納条件,〕…
        (表格納用RDエリア名)〔格納条件〕)}
    |PARTITIONED BY 列名
      IN (〔(表格納用RDエリア名)境界値,〕…
         (表格納用RDエリア名)境界値,
          (表格納用RDエリア名))
    |PARTITIONED BY MULTIDIM
      (第1次元列名 第1次元境界値リスト
       ,{第2次元列名 第2次元境界値リスト
         | 〔FIX〕 HASH 〔ハッシュ関数名〕 
           BY 第2次元列名 〔,第2次元列名〕…})
      IN マトリクス分割表格納用RDエリア指定
    |〔FIX〕 HASH 〔ハッシュ関数名〕 BY 列名 〔,列名〕…
      IN (表格納用RDエリア名,表格納用RDエリア名,…)}〕
  〔表オプション〕…
  {〔表制約定義〕…|〔ON COMMIT {DELETE|PRESERVE}ROWS〕}
  〔WITH PROGRAM
≪各項目の詳細≫
表要素::={列定義|表制約定義}
 列定義::=列名 データ型〔ARRAY [最大要素数]〕
       〔{列データ抑制指定|〔列回復制約〕
         {IN {LOB列格納用RDエリア名
             |(LOB列格納用RDエリア名)
             |((LOB列格納用RDエリア名)
              〔,(LOB列格納用RDエリア名)〕…)
             |マトリクス分割LOB列格納用RDエリア指定}
          |抽象データ型定義内LOB格納用RDエリア指定}}〕
       〔プラグイン指定〕
       〔圧縮指定〕
       〔DEFAULT句〕
       〔列制約〕…
       〔予備列定義〕
       〔更新可能列属性〕
  列データ抑制指定::=SUPPRESS
  列回復制約::=RECOVERY 〔{ALL|PARTIAL|NO}〕
  抽象データ型定義内LOB格納用RDエリア指定::=
    ALLOCATE(属性名〔..属性名〕…
      IN {LOB属性格納用RDエリア名
         |(LOB属性格納用RDエリア名)
         |((LOB属性格納用RDエリア名)
           〔,(LOB属性格納用RDエリア名)〕)
         |マトリクス分割LOB属性格納用RDエリア指定}
      〔,属性名〔..属性名〕…
         IN {LOB属性格納用RDエリア名
            |(LOB属性格納用RDエリア名)
            |((LOB属性格納用RDエリア名)
             〔,(LOB属性格納用RDエリア名)〕)
            |マトリクス分割LOB属性格納用RDエリア指定}〕…)
  プラグイン指定::=PLUGIN プラグインオプション
  圧縮指定::= COMPRESSED 〔BY 圧縮分割サイズ〕
  圧縮分割サイズ::= n〔{K|M|G}〕
  DEFAULT句::=DEFAULT 〔既定値〕
  既定値::={定数|USER|CURRENT_USER|CURRENT_DATE|CURRENT DATE
         |CURRENT_TIME|CURRENT TIME
         |CURRENT_TIMESTAMP〔(小数秒精度)〕 〔USING BES〕
         |CURRENT TIMESTAMP〔(小数秒精度)〕 〔USING BES〕
         |NULL}
  列制約::={非ナル値制約指定
         |単一列一意性制約定義
          〔インデクスオプション〔インデクスオプション〕〕
         |{ 単一列検査制約定義〔制約名定義〕
            |〔制約名定義〕単一列検査制約定義 }※3
         |{ 単一列参照制約定義〔制約名定義〕
            |〔制約名定義〕単一列参照制約定義}}※3
   予備列定義::=FOR RESERVED
  更新可能列属性::=UPDATE 〔ONLY FROM NULL〕
   非ナル値制約指定::=
      {〔NULL
       |NOT NULL〔WITH DEFAULT〔SYSTEM GENERATED〕〕〕※2
       |〔〔NOT NULL〕 WITH DEFAULT〔SYSTEM GENERATED〕〕}※1
   単一列一意性制約定義::=
       {〔{UNIQUE|PRIMARY}〕 CLUSTER KEY〔{ASC|DESC}〕
         〔IN{インデクス格納用RDエリア名
            |(インデクス格納用RDエリア名)
            |((インデクス格納用RDエリア名)
             〔,(インデクス格納用RDエリア名)〕…)}〕
        |PRIMARY KEY〔{ASC|DESC}〕
         〔IN{インデクス格納用RDエリア名
            |(インデクス格納用RDエリア名)
            |((インデクス格納用RDエリア名)
             〔,(インデクス格納用RDエリア名)〕…)}〕}
   インデクスオプション::={PCTFREE=未使用領域の比率
                 |UNBALANCED SPLIT}
   単一列検査制約定義::=CHECK(探索条件)
   単一列参照制約定義::=参照指定
  複数列一意性制約定義::=
      {〔{UNIQUE|PRIMARY}〕 CLUSTER KEY
        (列名〔{ASC|DESC}〕〔,列名〔{ASC|DESC}〕〕…)
        〔IN{インデクス格納用RDエリア名
           |(インデクス格納用RDエリア名)
           |((インデクス格納用RDエリア名)
            〔,(インデクス格納用RDエリア名)〕…)
           |マトリクス分割インデクス格納用RDエリア指定}〕
       |PRIMARY KEY(列名〔{ASC|DESC}〕
        〔,列名〔{ASC|DESC}〕〕…)
        〔IN{インデクス格納用RDエリア名
           |(インデクス格納用RDエリア名)
           |((インデクス格納用RDエリア名)
            〔,(インデクス格納用RDエリア名)〕…)
           |マトリクス分割インデクス格納用RDエリア指定}〕}
  複数列検査制約定義::=CHECK(探索条件)
  複数列参照制約定義::=FOREIGN KEY(列名 〔,列名〕…)参照指定
格納条件::=列名{=|<>|^=|!=|<|<=|>|>=}
       {定数|(定数〔,定数〕…)}
第1次元列名::=列名
第2次元列名::=列名
第1次元境界値リスト::=境界値リスト
第2次元境界値リスト::=境界値リスト
 境界値リスト::=((境界値)〔,(境界値)〕…)
マトリクス分割表格納用RDエリア指定::=2次元格納用RDエリア指定
マトリクス分割インデクス格納用RDエリア指定::=2次元格納用RDエリア指定
マトリクス分割LOB列格納用RDエリア指定::=2次元格納用RDエリア指定
マトリクス分割LOB属性格納用RDエリア指定::=2次元格納用RDエリア指定
 2次元格納用RDエリア指定::=(マトリクス分割用RDエリアリスト
                 〔,マトリクス分割用RDエリアリスト〕…)
 マトリクス分割用RDエリアリスト::=(RDエリア名〔,RDエリア名〕…)
ハッシュ関数名::={HASH1|HASH2|HASH3|HASH4|HASH5|HASH6|HASHZ
         |HASH0|HASHA|HASHB|HASHC|HASHD|HASHE|HASHF}
参照指定::=REFERENCES 被参照表 〔参照制約動作指定〕
被参照表::=表名
参照制約動作指定::={削除動作 〔更新動作〕|更新動作 〔削除動作〕}
削除動作::=ON DELETE 参照動作 
更新動作::=ON UPDATE 参照動作
参照動作::={ CASCADE|RESTRICT}
制約名定義::=CONSTRAINT 制約名
表オプション::=
   {PCTFREE={未使用領域の比率
           |(〔未使用領域の比率〕,セグメント内の空きページ比率)}
    |{LOCK ROW|LOCK PAGE}
    |SUPPRESS〔DEC〔IMAL〕〕
    |WITHOUT ROLLBACK
    |INDEXLOCK{NONE|PAGE}
    |SEGMENT REUSE {〔セグメント数〔{K|M}〕〕|NO}
    |INSERT ONLY 〔WHILE {日間隔データ|ラベル付き間隔} BY 列名〕}
注※1

FIX表の列,クラスタキー又は主キーを構成する列の場合

注※2

上記以外の場合

注※3

制約名定義の指定位置は,システム共通定義pd_constraint_nameオペランドの指定値,又はクライアント環境変数PDCNSTRNTNAMEの指定値によって決まります。詳細は,「表制約定義」を参照してください。

(4) オペランド

(a) 〔SHARE〕FIX〔GLOBAL TEMPORARY〕

〔SHARE〕FIX

行の長さが固定している表の場合に指定します。表データを共用RDエリアに格納し,共用表とする場合はSHAREを指定します。

ただし,共用RDエリアのないHiRDB/シングルサーバではHiRDB/パラレルサーバとSQLの互換性を保つためにSHAREを指定することで共用表を定義できますが,表データは通常のユーザ用RDエリアに格納します。

行長の変更を伴うデータベースの操作はできませんが,行の格納効率を上げられます。また,行単位インタフェースを用いることで,列数が多い表の場合,アクセス性能を上げられます。

FIXについての規則を次に示します。

  1. FIXを指定した場合,次のデータ型は指定できません。

    ・VARCHAR

    ・NVARCHAR

    ・MVARCHAR

    ・BLOB

    ・BINARY

    ・抽象データ型

  2. FIXを指定した場合,繰返し列は指定できません。

  3. FIXを指定した場合,行の長さが次の値を超えてはいけません。

    [図データ]

    定義する表が一時表の場合は,実体化する際に行の長さが上記の値を超えているかをチェックします。

    一時表の実体化については,マニュアル「HiRDB Version 9 システム導入・設計ガイド」の「一時表」を参照してください。

  4. FIXを指定して定義した表の各列には,NOT NULLが仮定されます。

  5. SHAREとFIXを指定した場合,表データを複数のRDエリアに分割して格納できません。

  6. 定義する表が一時表の場合はSHAREを指定できません。

GLOBAL TEMPORARY

定義する実表が一時表の場合に指定します。ただし,表の構成列に次のデータ型は指定できません。

  • BLOB型

  • ユーザ定義及びプラグインが提供する抽象データ型

(b) 〔認可識別子.〕表識別子

認可識別子

定義する実表の所有者になるユーザの認可識別子を指定します。

表識別子

定義する実表の名前を指定します。表識別子は,表所有者の表中で同じ識別子は使用できません。

(c) 表要素::={列定義|表制約定義}

列定義

表を構成する列自体の定義(列名,データ型など)に指定します。単一列ごとに非ナル値制約,一意性制約,検査制約,参照制約の項目を指定できます。

表制約定義::={複数列一意性制約定義

      〔インデクスオプション〔インデクスオプション〕〕

     |{複数列検査制約定義〔制約名定義〕

     |〔制約名定義〕複数列検査制約定義}

     |{複数列参照制約定義〔制約名定義〕

     |〔制約名定義〕複数列参照制約定義}}

複数の列に一意性制約,検査制約,参照制約を指定します。

制約名定義の指定位置は,システム共通定義pd_constraint_nameオペランドの指定値,又はクライアント環境変数PDCNSTRNTNAMEの指定値によって決まります。制約名定義の指定位置を次の表に示します。

表3‒22 制約名定義の指定位置

クライアント環境変数

システム共通定義

pd_constraint_name

指定なし

LEADING

TRAILING

PDCNSTRNTNAME

指定なし

LEADING

TRAILING

(凡例)

前:制約名定義を制約定義の前に指定します(標準SQL仕様)。

後:制約名定義を制約定義の後に指定します(XDM/RD互換仕様)。

SHAREとFIXを指定している場合,複数列参照制約は指定できません。

(d) {IN〜

{IN{表格納用RDエリア名
   |(表格納用RDエリア名)
   |(〔(表格納用RDエリア名)格納条件,〕…
     (表格納用RDエリア名)〔格納条件〕)}
 |PARTITIONED BY 列名
   IN(〔(表格納用RDエリア名)境界値,〕…
    (表格納用RDエリア名)境界値,(表格納用RDエリア名))
 |PARTITIONED BY MULTIDIM
   (第1次元列名 第1次元境界値リスト
    ,{第2次元列名 第2次元境界値リスト
      |〔FIX〕 HASH 〔ハッシュ関数名〕
        BY 第2次元列名 〔,第2次元列名〕…})
   IN マトリクス分割表格納用RDエリア指定
 |〔FIX〕 HASH 〔ハッシュ関数名〕 BY 列名 〔,列名〕…
   IN (表格納用RDエリア名,表格納用RDエリア名,…)}
IN

表の行を格納するRDエリアを指定します。定義する表が一時表の場合は指定できません。

表格納用RDエリア名

表の行を格納する一時表用RDエリア以外のユーザ用RDエリアの名前を指定します。

ただし,HiRDB/パラレルサーバでは次の制限があります。SHAREを指定している場合,共用RDエリアの名前を指定します。また,SHAREを指定していない場合,共用RDエリアの名前を指定できません。

RDエリア名を省略した場合,表を格納するRDエリアは次の表に示すとおりに決定されます。また,HiRDB/パラレルサーバではSHAREを指定している場合,共用RDエリアが格納先の候補となります。SHAREを指定していない場合,共用RDエリアは格納先の候補となりません。

なお,リバランス表を格納しているユーザ用RDエリアは指定できません。

表3‒23 表格納RDエリアの指定を省略したときの表格納RDエリアの決定方法

プライマリ

キー又は

クラスタ

キーの指定

インデクス格納

RDエリアの

指定

表格納RDエリアの決定方法

なし

次に示す優先順位で表格納RDエリアを決定します。

  1. インナレプリカ機能を適用しないRDエリアのうち,定義されている表と順序数生成子の合計が一番少ない公用RDエリア

  2. 1の条件を満たすRDエリアが複数ある場合は,HiRDBが最初に見付けたRDエリア

  3. 1,2で決定できなかった場合は,インナレプリカ機能を適用するRDエリア(オリジナルRDエリア)のうち,定義されている表と順序数生成子の合計が一番少ない公用RDエリア

  4. 3の条件を満たすRDエリアが複数ある場合は,HiRDBが最初に見付けたRDエリア

あり

なし

次に示す優先順位で表格納RDエリアを決定します。

  1. インナレプリカ機能を適用しないRDエリアのうち,定義されている表と順序数生成子の合計が一番少ない公用RDエリア

  2. 1の条件を満たすRDエリアが複数ある場合は,インデクスの定義数が一番少ない公用RDエリア

  3. 1,2の条件を満たすRDエリアが複数ある場合は,HiRDBが最初に見付けたRDエリア

  4. 1,2,3で決定できなかった場合は,インナレプリカ機能を適用するRDエリア(オリジナルRDエリア)のうち,定義されている表と順序数生成子の合計が一番少ない公用RDエリア

  5. 4の条件を満たすRDエリアが複数ある場合は,インデクスの定義数が一番少ない公用RDエリア

  6. 4,5の条件を満たすRDエリアが複数ある場合は,HiRDBが最初に見付けたRDエリア

インナレプリカ機能を適用しないRDエリア

  1. インナレプリカ機能を適用しないRDエリアのうち,定義されている表と順序数生成子の合計が一番少ない公用RDエリア

  2. 1の条件を満たすRDエリアが複数ある場合は,HiRDBが最初に見付けたRDエリア

インナレプリカ機能を適用するRDエリア(オリジナルRDエリア)

  1. インナレプリカ機能を適用するRDエリアのうち,オリジナルRDエリアで,かつレプリカRDエリア数の等しい公用RDエリア

  2. 1の条件を満たすRDエリアが複数ある場合は,HiRDBが最初に見付けたRDエリア

(凡例)

−:該当しません。

注※

HiRDB/パラレルサーバで,かつインデクス格納用RDエリアの指定がある場合,インデクス格納用RDエリアと同じサーバ内のRDエリアが表格納RDエリアの選定対象になります。

格納条件

表を複数のRDエリアに分割(表の横分割)して格納するための条件を指定します。格納条件を指定した場合,単一列分割になります。

定数の複数指定は格納条件になる列が次に示す形式の場合に有効です。

  • 列の値が範囲指定によってグループ分けできないとき(例えば,店番号や部課コードなど)

  • 列の値が文字列などの不連続な値で構成されているとき

格納条件についての規則を次に示します。

  1. 格納条件を複数指定する場合,格納条件中に同じ列名を指定してください。

  2. 格納条件を複数指定した場合に行が格納されるRDエリアは,格納条件の指定順にHiRDBが条件を評価して,最初に真になった格納条件に対応したRDエリアです。どちらかの条件でも真にならなかった行は,格納条件を指定しないRDエリアに格納されます。格納条件を指定しないRDエリアが定義されていない場合は格納できません。

  3. HiRDBが格納条件を評価した結果,行が格納されないRDエリアがある場合,表の定義はできません。

  4. データ挿入時,挿入するデータに該当するRDエリアがない場合はデータを挿入できません。

  5. データ更新時,格納条件に指定した列の値は更新できません。

  6. 一つの格納条件は一個のRDエリア名と対応します。RDエリアは最大4,096個指定できます。ただし,同じRDエリア名は指定できません。

  7. 列名に予備列は指定できません。

PARTITIONED BY 列名

永続実表を境界値によって分割し,複数のRDエリアに格納する場合に指定します。分割できるRDエリアは,重複を含んで最大4096個です。

なお,定義する表が一時表の場合は指定できません。

列名

境界値を指定する列の名称を指定します。指定できる列のデータ型は,格納条件で比較演算できる列のデータ型と同じです。PARTITIONED BY 列名を指定した場合,単一列分割になります。

BY 列名についての規則を次に示します。

  1. データ更新時,列名で指定した列の値は更新できません。

  2. 列名で指定した列はNOT NULL(非ナル値制約,FIX指定,クラスタキー,又は主キー)にしてください。

  3. クラスタキーを指定した列がある場合,それ以外の列に対して境界値は指定できません。

  4. クラスタキーが複数列の場合,先頭の列以外の列に対して境界値は指定できません。

  5. 繰返し列は指定できません。

  6. 予備列は指定できません。

境界値

表の行を分割するときの境界値を指定します。境界値には定数を指定してください。

境界値についての規則を次に示します。

  1. 定数には,次のものは指定できません。

    ・長さ0の文字列定数,各国文字列定数,混在文字列定数,及び16進文字列定数

    ・長さ256バイト以上の文字列定数,長さ128文字以上の各国文字列定数,長さ256バイト以上の混在文字列定数,及び長さ256バイト以上の16進文字列定数(16進文字列の文字数512文字以上)

  2. 境界値は昇順に指定してください。同じ値は指定できません。

  3. 最後に指定する境界値には,最大値は指定しないでください。

  4. 表格納用RDエリア名と境界値は交互に指定し,表格納用RDエリア名で始まり表格納用RDエリア名で終わるようにしてください。

  5. 指定できる表格納用RDエリア名の延べ数は,最大4096個です。

  6. 表格納用RDエリア名は,同一のものを複数指定できます。ただし,同じ表格納用RDエリア名は続けて指定しないでください。

  7. 最初に境界値を指定するRDエリアには,指定する境界値以下の値の行が格納されます。2番目以降(最後は除く)に指定するRDエリアには,その前に指定した境界値より大きく,かつその後に指定する境界値以下の値の行が格納されます。最後に指定するRDエリアには,その前に指定した境界値より大きい値の行が格納されます。

PARTITIONED BY MULTIDIM

表データをある一つの列(第1次元分割列)で分割し,さらに各境界値データを別の列(第2次元分割列)で分割する場合に指定します。このような指定による分割方法をマトリクス分割といい,分割した表を,マトリクス分割表といいます。

マトリクス分割表を定義する場合,HiRDB Advanced High Availabilityが必要です。

なお,定義する表が一時表の場合は指定できません。

第1次元列名::=列名

第1次元分割列名を指定します。

第1次元分割列名についての規則を次に示します。

  1. 指定した列は,NOT NULLにしてください。NOT NULLにする方法を次に示します。

    ・FIX表として表を定義する。

    ・列定義でNOT NULLを指定する。

    ・クラスタキー,又は主キーを定義する。

  2. 指定した列の値は更新できません。

  3. 列名に繰返し列は指定できません。

  4. 列名に指定する列のデータ型は,格納条件の比較演算できる列のデータ型を参照してください。

  5. 列名に予備列は指定できません。

第1次元境界値リスト::=境界値リスト

境界値リスト::=((境界値)〔,(境界値)〕…)

第1次元列名で指定した列の境界値リストを指定します。

境界値には,表の行を分割するときの境界値を指定します。境界値についての規則を次に示します。

  1. 境界値には定数を指定してください。

  2. 境界値は昇順に指定してください。

  3. 境界値には,次の定数はできません。

    ・長さ0の文字列定数,各国文字列定数,混在文字列定数,及び16進文字列定数

    ・長さ256バイト以上の文字列定数,及び混在文字列定数

    ・長さ128文字以上の各国文字列定数

    ・長さ256バイト以上の16進文字列定数(16進文字列の文字数512文字以上)

    また,最後に指定する境界値に最大値は指定できません。

第2次元列名::=列名

第2次元分割列名を指定します。

規則については,第1次元列名の説明を参照してください。

第2次元境界値リスト::=境界値リスト

境界値リスト::=((境界値)〔,(境界値)〕…)

第2次元列名で指定した列の境界値リストを指定します。

境界値の規則については,第1次元境界値リストの境界値の説明を参照してください。

〔FIX〕 HASH 〔ハッシュ関数名〕

 BY 第2次元列名 〔,第2次元列名〕…

第2次元列名::=列名

使用するハッシュ関数名,及び第2次元分割列名を指定します。

指定方法の詳細,及び規則については,〔FIX〕HASHの項目を参照してください。

マトリクス分割表格納用RDエリア指定::=2次元格納用RDエリア指定

2次元格納用RDエリア指定::=

  (マトリクス分割用RDエリアリスト

   〔,マトリクス分割用RDエリアリスト〕…)

マトリクス分割用RDエリアリスト::=

  (RDエリア名〔,RDエリア名〕…)

マトリクス分割表,及びマトリクス分割表へのクラスタキー,主キー,BLOB列,BLOB属性の抽象データ型を定義する場合,それを格納するRDエリア名を指定します。

マトリクス分割表格納用RDエリア指定についての規則を次に示します。

  1. RDエリア名の指定の規則については,各オペランドのRDエリアの説明を参照してください。

  2. 一つのマトリクス分割用RDエリアリストに指定するRDエリアの数は,第2次元境界値リストに指定した境界値の数+1です。また,第2次元分割列にハッシュ関数を使用する場合は,ユーザ任意の数です。

  3. 指定できるマトリクス分割用RDエリアリストの数は,第1次元境界値リストに指定した境界値の数+1です。

  4. マトリクス分割表へのクラスタキー,主キー,BLOB列,及びBLOB属性を持つ抽象データ型を定義する場合,マトリクス分割表格納用RDエリア指定に対応するようにRDエリアを指定してください。

  5. クラスタキーは単一列に指定できません。

  6. 指定できるRDエリアの数は重複を含み最大4096個です。

  7. クラスタキーが2列以上の場合,分割に指定した列を先頭から同順で含む必要があります。

〔FIX〕HASH

永続実表をハッシュ関数によって分割し,複数のRDエリアに格納する場合に指定します。同じ表格納用RDエリア名を連続して指定できます。また,マトリクス分割表の第2次元分割列にハッシュ関数を指定する場合にも指定します。

表の分割方式をフレキシブルハッシュ分割にする場合は,HASHを指定します。FIXハッシュ分割にする場合は,FIX HASHを指定します。

なお,定義する表が一時表の場合は指定できません。

〔ハッシュ関数名〕

表を分割するためのハッシュ関数を指定します。

ハッシュ関数名を省略した場合,分割方法によって次のハッシュ関数が仮定されます。

  • 表をハッシュ関数によって分割する場合は,HASH1を仮定する

  • マトリクス分割表の第2次元分割列にハッシュ関数を指定する場合は,HASH6を仮定する

BY 列名 〔,列名〕…

ハッシュ関数の対象となる列の名称を指定します。指定できる列のデータ型は,格納条件で比較演算できる列のデータ型と同じです。

列名を一つ指定すると単一列分割,列名を複数指定すると複数列分割になります。

単一列分割する表の場合:
  • クラスタキーを指定した列がある場合,それ以外の列を列名に指定できません。

  • クラスタキーが複数列の場合,先頭の列以外の列を列名に指定できません。

複数列分割する表の場合:
  • クラスタキーを単一列に指定できません。

  • クラスタキーが複数列の場合,先頭から分割に指定した列を同順にすべて含む必要があります。

マトリクス分割表の第2次元分割列を単一列分割する場合:
  • クラスタキーを単一列に指定できません。

  • クラスタキーが複数列の場合,先頭から2番目の列以外の列を列名に指定できません。

マトリクス分割表の第2次元分割列を複数列分割する場合:
  • クラスタキーを単一列に指定できません。

  • クラスタキーが複数列の場合,先頭から2番目以降の列を同順に指定する必要があります(クラスタキー構成列の先頭から2番目の列以降の列をすべて含む必要はありません)。

主キーを指定した列がある場合,表の分割方法によって,主キーの定義可否が決まります。表を横分割する場合の主キーの定義可否(UNIQUE指定可否)については,「表を横分割する場合のUNIQUE指定可否」を参照してください。

BY 列名についての規則を次に示します。

  1. 複数列分割に指定できる列の最大数は16個です。ただし,マトリクス分割表の第2次元分割列にハッシュ関数を指定する場合に指定できる列の最大数は15個です。

  2. 複数列分割する場合は,同じ列名を重複して指定できません。

  3. 複数列分割する場合は,列名には相互に依存しない値を持つ列を組み合わせて指定します。

  4. 列名で指定した列はNOT NULL(非ナル値制約,FIX指定,クラスタキー,又は主キー)にしてください。

  5. フレキシブルハッシュ分割の表,又はマトリクス分割表の第2次元分割列にフレキシブルハッシュ分割を指定する場合には,UNIQUEを指定したクラスタキー,主キー,及びUNIQUEを指定したインデクスは定義できません。

  6. FIXハッシュ分割では,データ更新時,列名で指定した列の値は更新できません。

  7. 繰返し列は指定できません。

  8. 列名をマトリクス分割表の第2次元列名に指定する場合は,第1次元列名で指定している列名は指定できません。

  9. 予備列は指定できません。

(e) 表オプション

::={PCTFREE={未使用領域の比率
          |(〔未使用領域の比率〕,セグメント内の空きページ比率)}
    |{LOCK ROW|LOCK PAGE}|SUPPRESS〔DEC〔IMAL〕〕
    |WITHOUT ROLLBACK
    |INDEXLOCK{NONE|PAGE}
    |SEGMENT REUSE
        {〔セグメント数〔{K|M}〕〕|NO}
    |INSERT ONLY 〔WHILE {日間隔データ|ラベル付き間隔}BY 列名〕}
PCTFREE={未使用領域の比率|(〔未使用領域の比率〕,セグメント内の空きページ比率)}

同じ表のオプションを繰り返し指定できません。

PCTFREEの指定は,括弧を付けた場合と括弧を付けない場合で指定内容が異なるので注意してください。

PCTFREE=30は,未使用領域の比率が30%を示します。

PCTFREE=(,30)は,セグメント内の空きページ比率が30%を示します。

未使用領域の比率

表の初期作成時にデータベース内に設定する未使用領域の比率を指定します。未使用領域の比率は,0〜99(%)を指定できます。未使用領域の比率を省略すると,30(%)が仮定されます。仮定値は,システム共通定義のpd_ddl_tbl_pctfreeオペランドで変更できます。pd_ddl_tbl_pctfreeオペランドについては,マニュアル「HiRDB Version 9 システム定義」を参照してください。

未使用領域の比率は,データベース作成ユティリティ,及びデータベース再編成ユティリティ実行時に適用されます。INSERT文やUPDATE文など,ほかの追加,及び更新ではPCTFREE=(0,0)が仮定されます。

未使用領域の比率についての規則を次に示します。

  1. クラスタキーを定義する場合,次に示す理由のためPCTFREEを指定してください。

    ・データの初期作成,又は再編成後の挿入データをクラスタリング可能にするため,表中に空きを作成しておく。

    ・可変長データを含む表に対してデータの初期作成,又は再編成後に行長が長くなるような更新をしたとき,できるだけ近くに格納できるように表中に空きを作成しておく。

  2. クラスタキーのないFIX表に対しては,PCTFREE=(0,0)を指定してください。PCTFREEを省略した場合,PCTFREE=(0,0)を仮定します。仮定値は,システム共通定義のpd_ddl_tbl_fix_pctfreeオペランドで変更できます。pd_ddl_tbl_fix_pctfreeオペランドについては,マニュアル「HiRDB Version 9 システム定義」を参照してください。

  3. クラスタキーのない非FIX表に対して,PCTFREEを指定すると,ページ内のレコード長が更新のために長くなった場合,該当ページの未使用領域が使用されます。

  4. 表の作成後,クラスタキーを定義する表に対して行の追加が頻繁に発生する場合,又は可変長データを含む表に対して,行長の長くなる更新が頻繁に発生する場合,未使用領域の比率を高く指定してください。

セグメント内の空きページ比率

表の作成時にセグメント内に設定する空きページ(未使用ページ)の比率を指定します。

セグメント内の空きページ比率は,0〜50(%)を指定できます。

セグメント内の空きページ比率を省略すると,10(%)が仮定されます。

仮定値は,システム共通定義のpd_ddl_tbl_pctfreeオペランドで変更できます。pd_ddl_tbl_pctfreeオペランドについては,マニュアル「HiRDB Version 9 システム定義」を参照してください。

セグメント内の空きページ数を求める計算式を次に示します。

[図データ]

ここで指定したセグメント内の空きページ比率は,データベース作成ユティリティ,又はデータベース再編成ユティリティ実行時に適用されます。

クラスタキーを定義する表に対して行の追加が頻繁に発生する場合,及び行長の長くなる更新が頻繁に発生する場合,その増えた分のデータがページ内の未使用領域に納まらないときに,値を指定してください。

LOCK ROW|LOCK PAGE}

検索時及び更新時の,最小の排他資源単位を指定します。行単位の場合はLOCK ROW,ページ単位の場合はLOCK PAGEを指定します。省略した場合,LOCK ROWを仮定します。

なお,定義する表が一時表の場合は,指定しても無視されます。

LOCK ROW

最小の排他資源単位を行にします。

LOCK PAGE

最小の排他資源単位をページにします。

SUPPRESS〔DEC〔IMAL〕〕

非FIX表で,表内のデータの一部を省略して格納するときに指定します。

SUPPRESSオプションの指定は,列に格納するデータの有効けた数が定義長より短い表の場合に,データベース容量の削減に有効です。ただし,DECIMALデータの場合,有効けた数は先頭の0部分を除いたけた数になります。

DEC〔IMAL〕

表内のDECIMALデータの先頭0を省略して格納するときに指定します。

DECIMALについての規則を次に示します。

  1. SUPPRESSを指定してDECIMALを省略しても,DECIMALが仮定されます。

  2. 格納するDECIMALデータの有効けた数が定義長と等しい場合,データは「定義長+1」の長さで格納されます。このため,SUPPRESSオプションを省略したときよりデータの長さが長くなるので注意してください。

  3. DECIMALデータの定義精度(全けた数)が1の場合も,格納されるデータの長さが,SUPPRESSオプションを省略したときより長くなるので注意してください。

  4. 抽象データ型の属性中のDECIMALは,この機能の対象外です。

WITHOUT ROLLBACK

トランザクションのコミットを待たないで,表への更新(追加,削除も含む)処理が完了した時点で,その行の排他を解除する表を定義したい場合に指定します。

WITHOUT ROLLBACKについての規則を次に示します。

  1. 該当する表の行の更新処理(追加,削除も含む)の行排他,及びロールバック可否を次の表に示します。

    表3‒24 WITHOUT ROLLBACK指定時の行の更新処理(追加,削除を含む)の行排他,及びロールバック可否

    操作対象

    システム定義

    pd_idx_without_rollback

    表に対する操作内容

    行の挿入

    行中の列の更新

    行の削除

    更新値が更新前の値と同じ

    更新値が更新前の値と異なる

    インデクスが定義されたWITHOUT ROLLBACK指定の表

    更新対象列がインデクス構成列である

    Y

    N

    ×

    実行できません。

    ×

    更新対象列がインデクス構成列ではない

    該当しません。

    該当しません。

    インデクスが定義されていないWITHOUT ROLLBACK指定の表

    (凡例)

    ○:行排他は行の更新処理完了を契機に解除されます。処理完了後は更新内容をロールバックできません。

    ×:行排他はトランザクション終了時に解除されます。処理完了後もトランザクション未終了時はロールバックできます。

    −:定義によりません。

  2. データベース作成ユティリティ及びデータベース再編成ユティリティを実行する場合は,このオプションの指定は無視されます。

  3. このオプションを指定する場合,FIX表にする必要があります。ただし,SHAREを指定している場合,このオプションは指定できません。

  4. このオプションを指定する場合,BLOB列の定義はできません。また,LOCK PAGEも指定できません。

  5. 定義する表が一時表の場合,このオプションは指定できません。

INDEXLOCK{NONE|PAGE}

XDM/RDとの互換のためのオプションであり,指定しても無視されます。

インデクスキー値無排他は,システム定義のpd_indexlock_modeオペランドで指定します。

pd_indexlock_modeオペランドについては,マニュアル「HiRDB Version 9 システム定義」を参照してください。

SEGMENT REUSE {〔セグメント数〔{K|M}〕〕|NO}

定義する表に,空き領域の再利用機能を使用する場合に指定します。

この指定を省略した場合,HiRDBは「セグメント数を指定していないSEGMENT REUSE」が指定されたものとして表を定義します。ただし,リバランス表,一時表の場合は,空き領域の再利用機能を適用しません。

空き領域の再利用機能については,マニュアル「HiRDB Version 9 システム導入・設計ガイド」を参照してください。

定義する表が一時表の場合,このオプションは指定できません。

セグメント数〔{K|M}〕

空き領域の再利用機能を使用し,かつ該当する表のセグメント数に上限を設定する場合,その上限のセグメント数を指定します。セグメント数は,1〜268,435,440の符号なし整数で指定できます。また,単位として,K(キロ),又はM(メガ)を使用できますが,268,435,440を超える値は指定できません。

行の挿入,削除を頻繁に行う表に対して,行の挿入性能の向上,及び指定したセグメント内での格納効率の向上が期待できます。

セグメント数の指定なし

空き領域の再利用機能を使用し,かつ該当する表のセグメント数に上限を設定しない場合,セグメント数を省略します。

行の挿入,削除を頻繁に行う表で,かつRDエリアに格納される表が該当する表だけの場合に適用してください。行の挿入性能の向上,及び該当する表を格納するRDエリア内での,空き領域の格納効率の向上が期待できます。

NO

空き領域の再利用機能を使用しない場合に指定します。

行の挿入,削除を頻繁に行わない表に対してはNOを指定してください。

SEGMENT REUSEについての規則を次に示します。

  1. 空き領域の再利用機能は,LOB列,LOB属性の抽象データ型列,及びインデクスに対しては無効となります。

  2. 空き領域の再利用機能は,リバランス表に対しては指定できません。

INSERT ONLY 〔WHILE {日間隔データ|ラベル付き間隔} BY 列名〕

表を改竄防止表とする場合に指定します。改竄防止表については,マニュアル「HiRDB Version 9 システム導入・設計ガイド」を参照してください。

改竄防止表とした場合,その表の値は更新できません。ただし,更新可能列は更新できます。

改竄防止表には,すべての列を更新可能列とすることはできません。

予備列を定義した表を,改竄防止表とすることはできません。

改竄防止表には,行の削除を禁止する期間(行削除禁止期間)を指定できます。行削除禁止期間を指定する場合,WHILEで期間を指定し,列名には挿入履歴保持列(DATE型の列で,かつSYSTEM GENERATEDの列)を指定してください。削除禁止期間を指定しない場合,永久的に行の削除はできません。

定義する表が一時表の場合,このオプションは指定できません。

日間隔データ

行削除禁止期間を,日間隔データの10進数表現で指定します。日間隔データの10進数表現については,「日間隔データの10進数表現」を参照してください。

なお,日間隔データは正の値だけ指定できます。

ラベル付き間隔

行削除禁止期間を,ラベル付き間隔で指定します。ラベル付き間隔については,「日付演算」を参照してください。

ラベル付き間隔の値式には,括弧で囲まれていない正の整数定数だけ指定できます。

列名

DATE型で,かつSYSTEM GENERATEDの列を指定してください。

行削除禁止期間には行を挿入した日を含み,行削除禁止期間の計算は,「日付演算」の「日付データと日間隔データとを加減算する場合の規則」に従います。削除禁止最終日付と削除可能日付は,それぞれ次の演算結果となります。

  • 削除禁止最終日付=行挿入日付+削除禁止期間−1日

  • 削除可能日付=行挿入日付+削除禁止期間

行挿入日付と削除禁止期間の指定値での,削除禁止最終日付と削除可能日付の関係を次の表に示します。

表3‒25 削除禁止最終日付と削除可能日付の関係

行挿入日付

削除禁止期間の指定値

削除禁止最終日付

削除可能日付

2002-03-01

1か年※1

2003-02-28

2003-03-01

1995-03-01

1か年※1

1996-02-29

1996-03-01

2002-02-28

1か月※2

2002-03-27

2002-03-28

2002-05-01

1か日※3

2002-05-01

2002-05-02

注※1

実際の指定形式は,日間隔データの場合は「00010000.」,ラベル付き間隔の場合は「1 YEAR」となります。

注※2

実際の指定形式は,日間隔データの場合は「00000100.」,ラベル付き間隔の場合は「1 MONTH」となります。

注※3

実際の指定形式は,日間隔データの場合は「00000001.」,ラベル付き間隔の場合は「1 DAY」となります。

(f) {〔表制約定義〕…|〔ON COMMIT {DELETE|PRESERVE}ROWS〕}

表制約定義〕…

標準SQLでは,表制約定義は表要素として指定します。したがって,表制約定義は表要素の並び中に表要素として指定することをお勧めします。表制約定義の詳細は,「表要素::={列定義|表制約定義}」の「表制約定義」の説明を参照してください。

ON COMMIT {DELETE|PRESERVE} ROWS

定義する実表が一時表の場合に指定でき,一時表のデータが存在する期間を指定します。

DELETE

トランザクション固有一時表を作成する場合に指定します。

一時表のデータは,トランザクション終了時に削除されます。

PRESERVE

SQLセッション固有一時表を作成する場合に指定します。

一時表のデータは,SQLセッション終了時に削除されます。

(g) 列定義

::=列名 データ型〔ARRAY [最大要素数]〕
 〔{列データ抑制指定|〔列回復制約〕
  {IN {LOB列格納用RDエリア名
     |(LOB列格納用RDエリア名)
     |((LOB列格納用RDエリア名)〔,(LOB列格納用RDエリア名)〕…)
     |マトリクス分割LOB列格納用RDエリア指定}
   |抽象データ型定義内LOB格納用RDエリア指定}}〕
 〔プラグイン指定〕〔圧縮指定〕〔DEFAULT句〕
 〔列制約…〕〔予備列定義〕〔更新可能列属性〕
列名

表を構成する列の名前を指定します。列名に同じ名前は指定できません。

データ型

列のデータ型を指定します。データ型については,「データ型」を参照してください。

スーパタイプでBLOBが定義されている抽象データ型,及びBOOLEANは指定できません。

指定するデータ型が抽象データ型で,認可識別子を省略した場合,省略時に仮定される認可識別子に同一名称の抽象データ型がないときは,認可識別子'MASTER'に同一名称の抽象データ型があれば,その抽象データ型を指定したものとします。

ARRAY [最大要素数]

繰返し列を定義する場合に指定します。

最大要素数には,2〜30,000の符号なし整数を指定します。

繰返し列は,次のデータ型には指定できません。

  • 文字集合を指定したCHAR,VARCHAR

  • BLOB

  • BINARY

  • 抽象データ型

繰返し列は,圧縮列に指定できません。

LOB列格納用RDエリア名

BLOB列のデータを格納するユーザLOB用RDエリアの名前を指定します。

LOB列格納用RDエリアについての規則を次に示します。

  1. データ型にBLOBを指定した列は,LOB列格納用RDエリア名を必ず指定してください。BLOB以外のデータ型を指定した列には指定できません。

  2. 指定するRDエリア名は,表格納用RDエリアと同じサーバに定義しているユーザLOB用RDエリアを指定してください。

  3. 表を分割する場合は,分割する数と同じ数のユーザLOB用RDエリアを指定してください。その場合,同じサーバのユーザ用RDエリアとユーザLOB用RDエリアが,同じ順番になるように指定してください。例を次に示します。

    (例)

    CREATE TABLE MOVIE (ID INT NOT NULL,

    IMAGE BLOB IN ((LU01),(LU02)))

    IN ((RU01) ID < 120,(RU02))

    (凡例)

    LU01,LU02,RU01,及びRU02は,RDエリア名を示します。

    RU01とLU01,RU02とLU02は,それぞれ同一サーバのRDエリアです。

  4. LOB列格納用RDエリアは,あらかじめデータベース初期設定ユティリティで作成,又はデータベース構成変更ユティリティで追加されていなければなりません。

  5. LOB列格納用RDエリア名を複数個指定する場合,同じRDエリア名は指定できません。境界値指定の横分割表,ハッシュ分割表,又はマトリクス分割表では,表格納用RDエリアとLOB列格納用RDエリアが1対1に対応するようにLOB列格納用RDエリア名を指定してください。表格納用RDエリア名を重複指定した場合は,LOB列格納用RDエリアも同一位置が重複するように指定してください。

    上記以外の場合は,LOB列格納用RDエリアは重複して指定できません。

マトリクス分割LOB列格納用RDエリア指定::=2次元格納用RDエリア指定

マトリクス分割表を定義する場合に指定します。

指定方法については,PARTITIONED BY MULTIDIMの2次元格納用RDエリア指定の説明を参照してください。また,指定するRDエリアについては,LOB列格納用RDエリア名の説明を参照してください。

(h) 列データ抑制指定::=SUPPRESS

列ごとのデータ抑制をします。固定長文字形式で後方空白のデータが多い場合にディスク容量を削除できます。

列データ抑制指定についての規則を次に示します。

  1. 列データの一番最後の文字が空白の場合,最後の空白から前方にサーチして連続している空白を,抑制してデータベースに格納します。この場合,1回空白が途切れたら,そこから前方の空白は抑制しません。

  2. CHAR,及びMCHARは,4文字以上の半角の空白をデータ抑制の対象とします。

  3. NCHARは,3文字以上の全角の空白をデータ抑制の対象とします。

  4. FIX表には,指定できません。

  5. データ型が抽象データ型の場合は指定できません。

  6. データ型がCHAR,MCHAR,又はNCHAR以外のときは,指定できません。

  7. 繰返し列には指定できません。

  8. この指定をした列は,データ抑制がされなかった場合でも,1バイトの付加情報が追加されます。

  9. 次に示すデータ型に対しては,この指定をしても無効となります。

    • CHARの場合,CHAR(5)より列データ長が短いとき

    • MCHARの場合,MCHAR(5)より列データ長が短いとき

    • NCHARの場合,NCHAR(3)より列データ長が短いとき

    なお,一度スペースが途切れた場合,そこから前方のスペースの抑制はされません。

(i) 列回復制約::=RECOVERY 〔{ALL|PARTIAL|NO}〕

LOB列格納用RDエリア,又は抽象データ型定義内LOB格納用RDエリアに対して,データベースの更新ログ取得方式を指定します。省略すると,更新前ログ取得モード(PARTIAL)が仮定されます。仮定値は,システム共通定義のpd_ddl_tbl_recoveryオペランドで変更できます。pd_ddl_tbl_recoveryオペランドについては,マニュアル「HiRDB Version 9 システム定義」を参照してください。

LOB列格納用RDエリアの場合:

データ型にBLOBを指定した場合,ユーザLOB用RDエリアのデータベースの更新ログ取得方式を指定します。データ型がBLOB以外の列には指定できません。

抽象データ型定義内LOB格納用RDエリアの場合:

抽象データ型定義内にBLOB属性がある場合,ユーザLOB用RDエリアのデータベースの更新ログ取得方式を指定します。

ALL

ログ取得モードでユーザLOB用RDエリアを運用するときに指定します。ログ取得モードで運用すると,ロールバック,及びロールフォワードに必要なデータベースの更新ログを取得します。

PARTIAL

更新前ログ取得モードでユーザLOB用RDエリアを運用するときに指定します。更新前ログ取得モードで運用すると,ロールバックに必要なデータベースの更新ログを取得します。

NO

ログレスモードでユーザLOB用RDエリアを運用するときに指定します。ログレスモードで運用すると,データベースの更新ログを取得しません。

指定するデータベースの更新ログ取得方式によって,UAPを実行するときの運用方法や,障害が発生したときのユーザLOB用RDエリアの回復方法が異なります。ログレスモードの運用については,マニュアル「HiRDB Version 9 システム運用ガイド」を参照してください。

(j) 抽象データ型定義内LOB格納用RDエリア指定

::=ALLOCATE(属性名〔..属性名〕…
 IN {LOB属性格納用RDエリア名
   |(LOB属性格納用RDエリア名)
   |((LOB属性格納用RDエリア名)〔,(LOB属性格納用RDエリア名)〕)
   |マトリクス分割LOB属性格納用RDエリア指定}
  〔,属性名〔..属性名〕…
   IN {LOB属性格納用RDエリア名
     |(LOB属性格納用RDエリア名)
     |((LOB属性格納用RDエリア名)〔,(LOB属性格納用RDエリア名)〕)
     |マトリクス分割LOB属性格納用RDエリア指定}〕…)
属性名〔..属性名〕

抽象データ型を構成する属性名を指定します。抽象データ型の属性が抽象データ型で,その入れ子になっている抽象データ型の属性にLOB型の属性がある場合は,そのLOB型の属性名を指定します。

次のような場合に属性名を指定してください。

  • 抽象データ型の属性のデータ型がLOB型の場合

  • 抽象データ型の属性が抽象データ型で,その入れ子になっている抽象データ型の属性がLOB型の属性の場合(そのLOB型の属性名を指定します)

LOB属性格納用RDエリア名

抽象データ型の任意の階層にある,BLOB属性のデータを格納するユーザLOB用RDエリアの名前を指定します。

LOB属性格納用RDエリアについての規則を次に示します。

  1. データ型にBLOBを含む抽象データ型を指定した場合,各BLOB属性に対してユーザLOB用RDエリアの名前を必ず指定してください。BLOB以外のデータ型を指定した属性には指定できません。

  2. 指定するRDエリア名は,表格納用RDエリアと同じサーバに定義しているユーザLOB用RDエリアを指定してください。

  3. 表を分割する場合は,分割する数と同じ数のユーザLOB用RDエリアを指定してください。その場合,同じサーバのユーザ用RDエリアとユーザLOB用RDエリアが,同じ順番になるようにしてください。

  4. LOB属性格納用RDエリアは,あらかじめデータベース初期設定ユティリティで作成,又はデータベース構成変更ユティリティで追加されていなければなりません。

  5. LOB属性格納用RDエリア名を複数個指定する場合,同じRDエリア名は指定できません。境界値指定の横分割表,ハッシュ分割表,又はマトリクス分割表では,表格納用RDエリアとLOB属性格納用RDエリアが1対1に対応するようにLOB属性格納用RDエリア名を指定してください。表格納用RDエリア名を重複指定した場合は,LOB属性格納用RDエリアも同一位置が重複するように指定してください。

    上記以外の場合は,LOB属性格納用RDエリアは重複して指定できません。

マトリクス分割LOB属性格納用RDエリア::=2次元格納用RDエリア指定

マトリクス分割表を定義する場合に指定します。

指定方法については,PARTITIONED BY MULTIDIMの2次元格納用RDエリア指定の説明を参照してください。また,指定するRDエリアについては,LOB属性格納用RDエリア名の説明を参照してください。

(k) プラグイン指定::=PLUGIN プラグインオプション

プラグインオプション

データ型プラグインが実装されている抽象データ型として定義された列に対して,データ型プラグインに渡すためのパラメタ情報を文字列定数(最大255バイト)で記述します。パラメタ情報には,16進文字列定数は指定できません。

パラメタ情報の詳細については,各種プラグインマニュアルを参照してください。

(l) 圧縮指定::=COMPRESSED 〔BY 圧縮分割サイズ〕

圧縮指定は,列データを圧縮する場合に指定します。BINARY型の列に圧縮を指定する場合は,定義長が256バイト以上である必要があります。255バイト以下の場合,エラーになります。

圧縮分割サイズ::= n〔{K|M|G}〕

圧縮処理や伸張処理のオーバヘッドを削減したい場合,又は圧縮効率を向上させたい場合に指定します。ただし,圧縮分割サイズを大きくすると,メモリ所要量が増加します。詳細は,マニュアル「HiRDB Version 9 システム導入・設計ガイド」を参照してください。

データをnバイト単位で分割して圧縮します。nは符号なし整数で指定し,単位としてK(キロバイト),M(メガバイト)及びG(ギガバイト)が指定できます(指定省略時はバイト単位)。圧縮分割サイズに指定できる値の範囲を次の表に示します。

表3‒26 圧縮分割サイズに指定できる値の範囲

単位

nに指定できる値の範囲

圧縮分割サイズの値

BINARY型

抽象データ型(XML型)

指定しない(バイト)

32,000≦n≦2,147,483,647

1,048,576≦n≦2,147,483,647

n

K

32≦n≦2,097,152

1024≦n≦2,097,152

n×1,024

M

1≦n≦2,048

1≦n≦2,048

n×1,048,576

G

1≦n≦2

1≦n≦2

n×1,073,741,824

圧縮分割サイズの注意事項を次に示します。

  • 圧縮分割サイズに指定できる値の範囲外の値を指定した場合,エラーになります。ただし,実際の最大長の計算結果が2,147,483,648の場合は,2,147,483,647になります。

  • 圧縮分割サイズに定義長より大きい値を指定した場合,分割しないで圧縮します。

  • 圧縮分割サイズを省略すると,BINARY型の場合は32,000バイトを仮定し,抽象データ型(XML型)の場合は1メガバイトを仮定します。ALTER TABLE文で列の定義長を大きくしても,圧縮列定義時に仮定した圧縮分割サイズは変わりません。

圧縮指定についての規則を次に示します。

  1. 圧縮指定ができる列は,次のデータ型の列だけです。

    • BINARY型

    • 抽象データ型(XML型)

    注※

    抽象データ型(XML型)の列のデータを圧縮するためには,バージョン09-03以降のHiRDB XML Extensionが必要です。バージョン09-02以前のHiRDB XML Extensionを使用している場合,抽象データ型(XML型)の列に圧縮指定はできません。

(m) DEFAULT句::=DEFAULT 〔既定値〕

データ挿入時に値を省略した場合に,DEFAULT句で指定した値が挿入されます。

DEFAULT句についての規則を次に示します。

  1. 一つの項目に対して,DEFAULT句とWITH DEFAULTは同時には指定できません。

  2. BLOB型,抽象データ型,及び定義長が32,001バイト以上のBINARY型の項目には指定できません。

  3. 繰返し列には指定できません。

  4. 予備列には指定できません。

既定値::={定数|USER|CURRENT_USER

|CURRENT_DATE|CURRENT DATE

|CURRENT_TIME|CURRENT TIME

|CURRENT_TIMESTAMP〔(小数秒精度)〕〔USING BES〕

|CURRENT TIMESTAMP〔(小数秒精度)〕〔USING BES〕|NULL}

既定値は,指定した項目に挿入できる値でなければなりません。

既定値についての規則を次に示します。

  1. 既定値を省略した場合,WITH DEFAULTの既定値が仮定されます。

  2. 既定値には,挿入時に上位有効けたが無効となるようなデータ型は指定できません。

  3. 非ナル値制約ありの列には,既定値としてNULLは指定できません。

  4. 既定文字集合以外の列に対してDEFAULT句を指定する場合,次の既定値は指定できません。

    ・CURRENT_DATE(CURRENT DATE)

    ・CURRENT_TIME(CURRENT TIME)

    ・CURRENT_TIMESTAMP(CURRENT TIMESTAMP)

  5. 既定値にUSER(CURRENT_USER),CURRENT_DATE(CURRENT DATE),CURRENT_TIME(CURRENT TIME),又はCURRENT_TIMESTAMP〔(小数秒精度)〕(CURRENT TIMESTAMP〔(小数秒精度)〕)を指定した場合,次の値が設定されます。

    USER(CURRENT_USER)の場合:

    行を挿入したときの実行ユーザの認可識別子の値が設定されます。

    CURRENT_DATE(CURRENT DATE)の場合:

    行を挿入したときの日付が設定されます。ただし,データベース作成ユティリティ(pdload)の場合は,ユティリティ起動時の日付が設定されます。

    CURRENT_TIME(CURRENT TIME)の場合:

    行を挿入したときの時刻が設定されます。ただし,データベース作成ユティリティ(pdload)の場合は,ユティリティ起動時の時刻が設定されます。

    CURRENT_TIMESTAMP〔(小数秒精度) 〔USING BES〕〕(CURRENT TIMESTAMP〔(小数秒精度)〕 〔USING BES〕)の場合:

    行を挿入したときの時刻印が設定されます。ただし,データベース作成ユティリティ(pdload)の場合は,ユティリティ起動時の時刻印が設定されます。また,HiRDB/パラレルサーバでマルチフロントエンドサーバ構成で運用する場合,時刻印はUAPが接続したフロントエンドサーバで取得します。

    USING BESを指定した場合,現在の時刻印をHiRDB/パラレルサーバの場合は更新行又は挿入行を格納するRDエリアを管理しているバックエンドサーバ,HiRDB/シングルサーバの場合はシングルサーバで取得します。

    USING BESを省略した場合,HiRDB/パラレルサーバの場合はフロントエンドサーバ,HiRDB/シングルサーバの場合はシングルサーバで現在の時刻印を取得します。

既定値取得サーバ種別指定にUSING BESを指定した列を分割キーに指定できません。

(n) 列制約

::={非ナル値制約
    |単一列一意性制約定義
     〔インデクスオプション〔インデクスオプション〕〕
    |{ 単一列検査制約定義〔制約名定義〕
      |〔制約名定義〕 単一列検査制約定義 }
    |{ 単一列参照制約定義〔制約名定義〕
      |〔制約名定義〕単一列参照制約定義 }}

列単位に次の制約を指定できます。

  • 非ナル値制約

  • 単一列一意性制約定義

  • 単一列検査制約定義

  • 単一列参照制約定義

制約名定義の指定位置は,システム共通定義pd_constraint_nameオペランドの指定値,又はクライアント環境変数PDCNSTRNTNAMEの指定値によって決まります。詳細は,表「制約名定義の指定位置」を参照してください。

SHAREとFIXを指定している場合,単一列参照制約は指定できません。

(o) 予備列定義::=FOR RESERVED

列を予備列として定義する場合に指定します。将来,FIX表に列を追加する見込みがある場合に予備列を定義します。予備列を定義すると,FIX表にデータが格納されている状態でも,予備列から切り出して列を追加できます。

予備列には,定義長分の0x00が格納されます。0x00以外の値は格納できません。

予備列定義の規則を次に示します。

  1. 非FIX表には定義できません。

  2. CHAR型以外の列に指定できません。

  3. 文字集合と同時に指定できません。

  4. 一つの表に複数指定できません。

  5. 表構成列の最後の列以外に指定できません。

  6. 予備列だけの表は定義できません。

  7. 一時表には定義できません。

(p) 更新可能列属性::=UPDATE 〔ONLY FROM NULL〕

改竄防止表を定義する場合又は改竄防止表に変更する予定のある表に更新可能列を定義する場合に指定します。

更新可能列属性は改竄防止表の場合だけ有効になります。

改竄防止表の定義については,「INSERT ONLY」オプションを参照してください。改竄防止表への変更については,「ALTER TABLE」の「CHANGE」の「INSERT ONLY」オプションを参照してください。

更新可能列属性についての規則を次に示します。

  1. SYSTEM GENERATEDを指定した列には指定できません。

  2. 次に示す更新できない列には指定できません。

    • クラスタキー構成列

    • 分割キー構成列(フレキシブルハッシュ分割表の分割キー構成列を除く)

    • 予備列

  3. 定義する表が一時表の場合,このオプションは指定できません。

UPDATE

改竄防止表で更新可能列を定義する場合に指定します。

UPDATE ONLY FROM NULL

改竄防止表での行の値がナル値から非ナル値へ一度だけ更新可能な列を定義する場合に指定します。

改竄防止表でUPDATE ONLY FROM NULL指定した列の値の更新可否を次に示します。

更新前の列の値

更新後の列の値

更新可否

ナル値

ナル値

ナル値

非ナル値

非ナル値

ナル値

×

非ナル値

非ナル値

×

(凡例)

○:更新できます。

×:更新できません。

繰返し列の場合は,ナル値(要素数が0の値)から添え字指定無しでの列単位更新だけ実行できます。

注※

更新前の値と同値を含みます。

UPDATE ONLY FROM NULL指定についての規則を次に示します。

  • NOT NULLを指定した列には指定できません。

  • FIX表の場合指定できません。

  • 主キー又はクラスタキー構成列には指定できません。

  • 分割キー構成列には指定できません。

  • BLOB型及び定義長が32,001バイト以上のBINARY型の列には指定できません。

更新可能列属性の指定可否と指定時の列の値の更新可否は次のようになります。

表種別

UPDATE指定

UPDATE ONLY

FROM NULL指定

左記の

指定なし

指定

可否

列の値の更新可否

指定

可否

列の値の更新可否

指定

可否

列の値の更新可否

非改竄防止表

改竄防止表

×

(凡例)

○:更新できます。

×:更新できません。

−:該当しません。

注※

ナル値から非ナル値へ一度だけ更新できます。

(q) 非ナル値制約指定

::={〔NULL
    |NOT NULL〔WITH DEFAULT〔SYSTEM GENERATED〕〕〕※2
    |〔〔NOT NULL〕 WITH DEFAULT〔SYSTEM GENERATED〕〕※1

注※1 FIX表の列,クラスタキー又は主キーを構成する列の場合

注※2 上記以外の場合

NULL

列名で指定した列にナル値を許す場合に指定できます。

FIX表の列,クラスタキー又は主キーを構成する列には指定できません。

NOT NULL

列名で指定した列にナル値を許さないように制約(非ナル値制約)する必要がある場合に指定します。

データ型が抽象データ型の場合,NOT NULLは指定できません。

NOT NULLは,繰返し列には指定できません。

WITH DEFAULT

INSERT文,又はデータベース作成ユティリティを使用したデータロード時に,挿入する列名と挿入値の指定を省略したとき,非ナル値制約を持つ列に対して既定値を挿入する場合に指定します。

WITH DEFAULTについての規則を次に示します。

  1. FIX表にWITH DEFAULTを指定した場合,NOT NULLを省略できます。

  2. データ型が抽象データ型の場合,WITH DEFAULTは指定できません。

  3. 予備列には指定できません。

  4. WITH DEFAULTを指定した場合,設定される列の既定値を次の表に示します。

    表3‒27 WITH DEFAULTを指定したときの既定値

    データ型

    列の既定値

    INTEGER

    0

    SMALLINT

    FLOAT

    SMALLFLT

    DECIMAL

    CHAR

    空白

    NCHAR

    MCHAR

    VARCHAR

    既定文字集合

    文字集合(UTF16以外)

    1バイトの空白

    文字集合(UTF16)

    1文字の空白

    NVARCHAR

    1文字の空白

    MVARCHAR

    1バイトの空白

    DATE

    行追加時の現在の日付

    TIME

    行追加時の現在の時刻

    TIMESTAMP

    行追加時の現在の時刻印

    INTERVAL YEAR TO DAY

    0か年0か月0か日間

    INTERVAL HOUR TO SECOND

    0時間0分0秒間

    BLOB

    長さ0バイトのデータ

    BINARY

    注 WITH DEFAULTを指定していない場合,ナル値が列の既定値になります。

SYSTEM GENERATED

列のデータ型がDATE型,又はTIME型の場合だけ指定できます。SYSTEM GENERATEDを指定した列を,挿入履歴保持列といいます。また,SYSTEM GENERATEDを指定した列は,改竄防止表の行削除禁止期間を指定するときに使用します。

SYSTEM GENERATEDを指定した列は,INSERT文でのデータ挿入時に,値の指定有無に関係なく,DATE型の場合は現在の日付(CURRENT_DATE),TIME型の場合は現在の時刻(CURRENT_TIME)を挿入します。

ただし,SYSTEM GENERATEDを指定した列に対する挿入値としてキーワードNULLを指定するとエラーになります。

(r) 単一列一意性制約定義

::={〔{UNIQUE|PRIMARY}〕 CLUSTER KEY〔{ASC|DESC}〕
   〔IN{インデクス格納用RDエリア名
      |(インデクス格納用RDエリア名)
      |((インデクス格納用RDエリア名)
        〔,(インデクス格納用RDエリア名)〕…)}〕
    |PRIMARY KEY〔{ASC|DESC}〕
     〔IN{インデクス格納用RDエリア名
        |(インデクス格納用RDエリア名)
        |((インデクス格納用RDエリア名)
         〔,(インデクス格納用RDエリア名)〕…)}〕}
〔{UNIQUE|PRIMARY}〕 CLUSTER KEY〔{ASC|DESC}〕

〔IN{インデクス格納用RDエリア名

   |(インデクス格納用RDエリア名)

   |((インデクス格納用RDエリア名)

     〔,(インデクス格納用RDエリア名)〕…)}〕

列名で指定した列をクラスタキーとして定義する場合に指定します。

クラスタキーについての規則を次に示します。

  1. クラスタキーを指定した場合,それらを構成する列には,次に示すデータ型は指定できません。

    ・BLOB

    ・BINARY

    ・抽象データ型

  2. クラスタキーを構成する列には,繰返し列は指定できません。

  3. クラスタキーを指定すると,指定した列に対してインデクスが定義されます。定義されたインデクスは削除できません。

  4. クラスタキーを構成する列にはNOT NULLが仮定されます。

  5. UNIQUE又はPRIMARYを指定したクラスタキーに重複するデータは挿入できません。

  6. 一つの表に二つ以上のクラスタキーは定義できません。

  7. クラスタキーを指定した場合,ハッシュ関数にHASHA〜HASHFは指定できません。

  8. クラスタキーを構成する列の長さの合計は,次の計算式を満たすようにしてください。

    列の長さの合計

    ≦MIN((インデクス格納用RDエリアのページサイズ÷2)−1242,4036)

  9. 分割表にクラスタキーを指定する場合の規則を次に示します。

    キーレンジ分割(格納条件,境界値)

    クラスタキーを構成する列には,分割キーを指定してください。

    ハッシュ分割

     単一列分割

      クラスタキーを構成する列には,分割キーを指定してください。

     複数列分割

      クラスタキーを単一列に指定できません。

    マトリクス分割

      クラスタキーを単一列に指定できません。

  10. 定義する表が一時表の場合は指定できません。

  11. クラスタキーを構成する列には,予備列は指定できません。

UNIQUE

クラスタキーを構成する列の値がすべての行で異なるように制約する必要がある場合に指定します。

PRIMARY

クラスタキーを構成する列を主キーとして定義する場合に指定します。

ASC

クラスタキーのインデクスを昇順に作成する場合に指定します。

DESC

クラスタキーのインデクスを降順に作成する場合に指定します。

インデクス格納用RDエリア名

クラスタキーのインデクスを格納するRDエリア名を指定します。

インデクスを横分割して格納する場合は,表を横分割する個数分のインデクス格納用RDエリア名を指定します。

指定するインデクス格納用RDエリア名は,一時表用RDエリア以外のユーザ用RDエリアにしてください。

ただし,HiRDB/パラレルサーバでは次の制限があります。

  • SHAREを指定している場合,インデクス格納用RDエリア名は,共用RDエリアにしてください。

  • SHAREを指定していない場合,インデクス格納用RDエリア名は,共用RDエリアを指定できません。

インデクス格納用RDエリア名についての規則を次に示します。

  1. RDエリアは,あらかじめデータベース初期設定ユティリティで作成,又はデータベース構成変更ユティリティで追加されていなければなりません。

  2. インデクス格納用RDエリア名を省略すると,定義した表を格納するRDエリアにインデクスも格納されます。

  3. インデクス格納用RDエリア名を複数個指定する場合,同じRDエリア名は指定できません。境界値指定の横分割表,ハッシュ分割表,又はマトリクス分割表では,表格納用RDエリアとインデクス格納用RDエリアが1対1に対応するようにインデクス格納用RDエリア名を指定してください。表格納用RDエリア名を重複指定した場合は,インデクス格納用RDエリアも同一位置が重複するように指定してください。

  4. リバランス表を格納しているユーザ用RDエリアは指定できません。また,リバランス表に対してクラスタキーを定義する場合,RDエリア名の指定は省略できません。

  5. インデクス格納用RDエリア名を指定する場合,その数は横分割した表の格納数と同じにして,同じサーバのRDエリアを指定する必要があります。このとき,インデクス格納用RDエリア名は表格納用RDエリア名の指定順に対応します。例を次に示します。

    1.格納条件によって横分割する場合

    [図データ]

    2.境界値によって横分割する場合

    [図データ]

PRIMARY KEY〔{ASC|DESC}〕

〔IN{インデクス格納用RDエリア名

   |(インデクス格納用RDエリア名)

   |((インデクス格納用RDエリア名)

     〔,(インデクス格納用RDエリア名)〕…)}〕

列名で指定した列を主キーとして定義する場合に指定します。

主キーについての規則を次に示します。

  1. 主キーを指定した場合,それらを構成する列には,次に示すデータ型は指定できません。

    ・BLOB

    ・BINARY

    ・抽象データ型

  2. 主キーを構成する列には,繰返し列は指定できません。

  3. 主キーを構成する列には,予備列は指定できません。

  4. 主キーを指定すると,指定した列に対してインデクスが定義されます。定義されたインデクスを削除する場合は,主キーを削除してください。

  5. 一時表の場合,ALTER TABLEで主キーを削除できません。一時表に定義された主キーを削除する場合は,一時表を削除して,再度定義してください。

  6. 主キーを構成する列にはNOT NULLが仮定されます。

  7. 主キーに重複するデータは挿入できません。

  8. 一つの表に二つ以上の主キーは定義できません。

  9. 横分割表に対する主キーの定義可否(UNIQUE指定可否)については,「表を横分割する場合のUNIQUE指定可否」を参照してください。

  10. 主キーを構成する列の長さの合計は,次の計算式を満たすようにしてください。

    列の長さの合計

    ≦MIN((インデクス格納用RDエリアのページサイズ÷2)−1242,4036)

    定義するインデクスが一時インデクスの場合は,一時表を実体化する際に上記を満たすかどうかをチェックします。

    一時表の実体化については,マニュアル「HiRDB Version 9 システム導入・設計ガイド」の「一時表」を参照してください。

  11. マトリクス分割表には,主キーを単一列に指定できません。

ASC

主キーのインデクスを昇順に作成する場合に指定します。

DESC

主キーのインデクスを降順に作成する場合に指定します。

インデクス格納用RDエリア名

主キーのインデクスを格納するRDエリア名を指定します。

指定するインデクス格納用RDエリアは,一時表用RDエリア以外のユーザ用RDエリアにしてください。

ただし,HiRDB/パラレルサーバでは次の制限があります。

  • SHAREを指定している場合,インデクス格納用RDエリア名は,共用RDエリアにしてください。

  • SHAREを指定してない場合,インデクス格納用RDエリア名は,共用RDエリアを指定できません。

インデクス格納用RDエリア名についての規則を次に示します。

  1. RDエリアは,あらかじめデータベース初期設定ユティリティで作成,又はデータベース構成変更ユティリティで追加されていなければなりません。

  2. RDエリア名を省略すると,定義した表を格納するRDエリアにインデクスも格納されます。ただし,HiRDB/シングルサーバでの横分割表の場合,又はHiRDB/パラレルサーバでの同じバックエンドサーバ内の横分割表の場合,インデクスは次のように格納されます。

    単一列分割する表の場合:

    分割キー以外の列を主キーに指定した場合,最初に分割条件を指定した表格納用RDエリアに格納されます。

    複数列分割する表の場合:

    最初に分割条件を指定した表格納用RDエリアに格納されます。

    マトリクス分割表の場合:

    主キーを単一列に指定できません。

  3. 指定するRDエリア名は,表格納用RDエリアと同じサーバに定義しているユーザ用RDエリアを指定してください。

  4. インデクス格納用RDエリア名を複数個指定する場合,同じRDエリア名は指定できません。境界値指定の横分割表,ハッシュ分割表,又はマトリクス分割表では,表格納用RDエリアとインデクス格納用RDエリアが1対1に対応するようにインデクス格納用RDエリア名を指定してください。表格納用RDエリア名を重複指定した場合は,インデクス格納用RDエリアも同一位置が重複するように指定してください。

  5. リバランス表を格納しているユーザ用RDエリアは指定できません。また,リバランス表に対して主キーを定義する場合,RDエリア名の指定は省略できません。

  6. 表を複数のRDエリアに分割格納している場合,インデクス格納用RDエリアは次のどれかの指定方法となります。

    (a) 単一列分割する表で,かつ分割キーに指定した列を主キーの先頭に指定する場合

    (b) 複数列分割する表で,かつ分割キーに指定したすべての列を主キーの先頭から同順に指定する場合

    (c) マトリクス分割表の場合

    (d) (a)〜(c)以外で,分割キーに指定した列を主キーの構成列にすべて指定する場合(順不同)

    (a)〜(c)の場合,RDエリア名は表格納用RDエリアと同じ数だけ指定します。この場合,インデクスの格納先は指定した表格納用RDエリアの指定順に対応します。

    (d)の場合,RDエリア名は表を分割して格納しているサーバの数だけ指定します。HiRDB/シングルサーバの場合は一つだけ指定し,HiRDB/パラレルサーバの場合は,表があるバックエンドサーバごとに一つのRDエリアを指定します。

    上記以外の場合,分割格納する表に対して主キーは定義できません。

  7. 定義する表が一時表の場合は指定できません。

(s) インデクスオプション::={PCTFREE=未使用領域の比率|UNBALANCED SPLIT}

PCTFREE=未使用領域の比率

インデクス作成時のインデクスページ内の未使用領域の比率を指定します。未使用領域の比率は,0〜99(%)を指定できます。省略すると30%が仮定されます。仮定値は,システム共通定義のpd_ddl_idx_pctfreeオペランドで変更できます。pd_ddl_idx_pctfreeオペランドについては,マニュアル「HiRDB Version 9 システム定義」を参照してください。

データベース作成ユティリティ,及びデータベース再編成ユティリティでのインデクス一括作成時に,未使用領域の比率でインデクスが作成されます。INSERT文やUPDATE文など,ほかの追加及び更新ではPCTFREE=0が仮定されます。

インデクスの定義後,行の追加が頻繁に発生する場合,未使用領域の比率を高く指定してください。

UNBALANCED SPLIT

ページスプリットする場合,両ページに対するキーの振り分けを不均衡にします。

スプリット対象ページへのキーの追加位置が,ページの前半部の場合はスプリット後の左側のページの空きを多く確保し,後半部の場合は右側のページの空きを多く確保するように分割します。このようなインデクスをアンバランスインデクススプリットといいます。

アンバランスインデクススプリットについては,マニュアル「HiRDB Version 9 システム運用ガイド」を参照してください。

(t) 単一列検査制約定義::=CHECK(探索条件)

列名で指定した列に対して検査制約を定義する場合に指定します。

探索条件

列の値を制約する条件を指定します。この条件が偽になる場合,この表に対して挿入,更新はできません。

探索条件中に指定する列は,列名で指定した列を指定してください。

探索条件には,次のものを含むことはできません。

  • 副問合せ

  • 集合関数又はSQL/XML集合関数

  • ウィンドウ関数

  • 繰返し列

  • 予備列

  • 関数呼出し

  • USER,CURRENT_USER

  • CURRENT DATE,CURRENT_DATE

  • CURRENT TIME,CURRENT_TIME

  • CURRENT TIMESTAMP,CURRENT_TIMESTAMP

  • ?パラメタ,埋込み変数

  • TIMEからTIMESTAMPへの変換を指定したCAST指定

  • 値式にTIME型を指定したスカラ関数VARCHAR_FORMAT

  • 抽象データ型の値式

  • システム定義スカラ関数

  • スカラ関数IS_USER_CONTAINED_IN_HDS_GROUP

  • 構造化繰返し述語

  • XMLコンストラクタ関数

  • SQL/XMLスカラ関数

(u) 単一列参照制約定義::=参照指定

列名で指定した列を外部キーとして定義する場合に指定します。

外部キーについての規則を次に示します。

  1. 外部キーを指定した場合,列には,次に示すデータ型は指定できません。

    • BLOB

    • BINARY

    • 抽象データ型

  2. 外部キー列には,繰返し列は指定できません。

  3. 外部キー列には,予備列は指定できません。

  4. 外部キーと参照する主キーは次に示す事項をすべて同じにしてください。

    • 対応するデータ型

    • 対応するデータ長

(v) 複数列一意性制約定義

::={〔{UNIQUE|PRIMARY}〕 CLUSTER KEY
    (列名〔{ASC|DESC}〕〔,列名〔{ASC|DESC}〕〕…)
    〔IN{インデクス格納用RDエリア名
       |(インデクス格納用RDエリア名)
       |((インデクス格納用RDエリア名)
         〔,(インデクス格納用RDエリア名)〕…)
       |マトリクス分割インデクス格納用RDエリア指定}〕
    |PRIMARY KEY(列名〔{ASC|DESC}〕
     〔,列名〔{ASC|DESC}〕〕…)
     〔IN{インデクス格納用RDエリア名
        |(インデクス格納用RDエリア名)
        |((インデクス格納用RDエリア名)
          〔,(インデクス格納用RDエリア名)〕…)
        |マトリクス分割インデクス格納用RDエリア指定}〕}
〔{UNIQUE|PRIMARY}〕 CLUSTER KEY(列名〔{ASC|DESC}〕

〔,列名〔{ASC|DESC}〕〕…)

〔IN{インデクス格納用RDエリア名

   |(インデクス格納用RDエリア名)

   |((インデクス格納用RDエリア名)

     〔,(インデクス格納用RDエリア名)〕…)

   |マトリクス分割インデクス格納用RDエリア指定}〕

複数の列をクラスタキーとして定義する場合に指定します。

クラスタキーについての規則を次に示します。

  1. クラスタキーを指定した場合,それらを構成する列には,次に示すデータ型は指定できません。

    ・BLOB

    ・BINARY

    ・抽象データ型

  2. クラスタキーを複数の列で構成する場合,項番1に加えて次に示すデータ型も指定できません。

    ・FLOAT

    ・SMALLFLT

  3. クラスタキーを構成する列には,繰返し列は指定できません。

  4. クラスタキーを構成する列には,予備列は指定できません。

  5. クラスタキーを指定すると,指定した列に対してインデクスが定義されます。定義されたインデクスを削除する場合,表を削除してください。

  6. クラスタキーを構成する列にはNOT NULLが仮定されます。

  7. UNIQUE又はPRIMARYを指定したクラスタキーに同じデータは挿入できません。

  8. 一つの表に二つ以上のクラスタキーは定義できません。

  9. クラスタキーを構成する列の数は,最大64個です。

  10. クラスタキーを指定した場合,ハッシュ関数にHASHA〜HASHFは指定できません。

  11. インデクスを構成する列の長さの合計は,次の計算式を満たすようにしてください。

    列の長さの合計

    ≦MIN((インデクス格納用RDエリアのページサイズ÷2)−1242,4036)

  12. 分割表にクラスタキーを指定する場合の規則を次に示します。

    キーレンジ分割(格納条件,境界値)

     クラスタキーを構成する列の先頭には,分割キーを指定してください。

    ハッシュ分割

     単一列分割

      クラスタキーを構成する列の先頭には,分割キーを指定してください。

     複数列分割

      クラスタキーを構成する列の先頭から,分割キーを同順にすべて含むように指定してください。

    マトリクス分割

     クラスタキーを構成する列の先頭から,第1次元分割列,第2次元分割列の順にすべて含むように指定してください。

     第2次元分割列を複数列分割する場合も,第1次元分割列から同順にすべての分割キーを含むように指定してください。

  13. 定義する表が一時表の場合は指定できません。

UNIQUE

クラスタキーを構成する複数の列の値がすべての行で異なるように制約する必要がある場合に指定します。

PRIMARY

クラスタキーを構成する複数の列を主キーとして定義する場合に指定します。

列名

クラスタキーを定義する列の名前を指定します。

クラスタキーを構成する列名は同じ列名を指定できません。複数の列にクラスタキーを定義する場合,各列の指定順序にキー値が作成されます。

ASC

クラスタキーのインデクスを昇順に作成する場合に指定します。

DESC

クラスタキーのインデクスを降順に作成する場合に指定します。

インデクス格納用RDエリア名

クラスタキーのインデクスを格納するRDエリア名を指定します。

インデクスを横分割して格納するときは,表を横分割する個数分のインデクス格納用RDエリア名を指定します。

指定するインデクス格納用RDエリア名は,一時表用RDエリア以外のユーザ用RDエリアにしてください。

インデクス格納用RDエリアについての規則を次に示します。

  1. RDエリアは,あらかじめデータベース初期設定ユティリティで作成,又はデータベース構成変更ユティリティで追加されていなければなりません。

  2. インデクス格納用RDエリア名を省略すると,定義した表を格納するRDエリアにインデクスも格納されます。

  3. 指定するRDエリア名は,表格納用RDエリアと同じサーバに定義しているユーザ用RDエリアを指定してください。

  4. インデクス格納用RDエリア名を複数個指定する場合,同じRDエリア名は指定できません。境界値指定の横分割表,ハッシュ分割表,又はマトリクス分割表では,表格納用RDエリアとインデクス格納用RDエリアが1対1に対応するようにインデクス格納用RDエリア名を指定してください。表格納用RDエリア名を重複指定した場合は,インデクス格納用RDエリアも同一位置が重複するように指定してください。

  5. インデクス格納用RDエリア名を複数個指定する場合,その数は横分割した表の格納数と同じにする必要があります。このとき,インデクス格納用RDエリア名は表格納用RDエリア名の指定順に対応します。例については単一列一意性制約定義のインデクス格納用RDエリア名を参照してください。

  6. リバランス表を格納しているユーザ用RDエリアは指定できません。また,リバランス表に対してクラスタキーを定義する場合,RDエリア名の指定は省略できません。

マトリクス分割インデクス格納用RDエリア指定::=2次元格納用RDエリア指定

マトリクス分割表を定義する場合に指定します。

指定方法については,PARTITIONED BY MULTIDIMの2次元格納用RDエリア指定の説明を参照してください。また,指定するRDエリアについては,インデクス格納用RDエリア名の説明を参照してください。

PRIMARY KEY(列名〔{ASC|DESC}〕

〔,列名〔{ASC|DESC}〕〕…)

〔IN{インデクス格納用RDエリア名

   |(インデクス格納用RDエリア名)

   |((インデクス格納用RDエリア名)

     〔,(インデクス格納用RDエリア名)〕…)

   |マトリクス分割インデクス格納用RDエリア指定}〕

複数の列を主キーとして定義する場合に指定します。

主キーについての規則を次に示します。

  1. 主キーを指定した場合,それらを構成する列には,次に示すデータ型は指定できません。

    ・BLOB

    ・BINARY

    ・抽象データ型

  2. 主キーを複数の列で構成する場合,項番1に加えて次に示すデータ型も指定できません。

    ・FLOAT

    ・SMALLFLT

  3. 主キーを構成する列には,繰返し列は指定できません。

  4. 主キーを構成する列には,予備列は指定できません。

  5. 主キーを指定すると,指定した列に対してインデクスが定義されます。定義されたインデクスを削除する場合は,主キーを削除してください。

  6. 一時表の場合,ALTER TABLEで主キーを削除できません。一時表に定義された主キーを削除する場合は,一時表を削除して,再度定義してください。

  7. 主キーを構成する列にはNOT NULLが仮定されます。

  8. 主キーに同じデータは挿入できません。

  9. 一つの表に二つ以上の主キーは定義できません。

  10. 主キーを構成する列の数は,最大64個です。

  11. 横分割表に対する主キーの定義可否(UNIQUE指定可否)については,「表を横分割する場合のUNIQUE指定可否」を参照してください。

  12. インデクスを構成する列の長さの合計は,次の計算式を満たすようにしてください。

    列の長さの合計

    ≦MIN((インデクス格納用RDエリアのページサイズ÷2)−1242,4036)

    定義するインデクスが一時インデクスの場合は,一時表を実体化する際に上記を満たすかどうかをチェックします。

    一時表の実体化については,マニュアル「HiRDB Version 9 システム導入・設計ガイド」の「一時表」を参照してください。

列名

主キーを定義する列の名前を指定します。

主キーを構成する列名は同じ列名を指定できません。複数の列に主キーを定義する場合,各列の指定順序にキー値が作成されます。

ASC

主キーのインデクスを昇順に作成する場合に指定します。

DESC

主キーのインデクスを降順に作成する場合に指定します。

インデクス格納用RDエリア名

主キーのインデクスを格納するRDエリア名を指定します。

  1. インデクス格納用RDエリア名を省略すると,定義した表を格納するRDエリアにインデクスも格納されます。ただし,HiRDB/シングルサーバでの横分割表の場合,又はHiRDB/パラレルサーバでの同じバックエンドサーバ内の横分割表の場合,インデクスは次のように格納されます。

    単一列分割する表の場合:

    定義した表を格納するRDエリアにインデクスも格納されます。

    複数列分割する表の場合:

    分割キーに指定したすべての列を,主キーの先頭から同じ順番で指定しないと,最初に分割条件を指定した表格納用RDエリアに格納されます。

    マトリクス分割表の場合:

    分割キーに指定したすべての列を,主キーの先頭から同じ順番で指定しないと,表定義はできません。分割キーに指定したすべての列を,主キーの先頭から同じ順番で指定しない場合,インデクス格納用RDエリア名を指定してください。

インデクス格納用RDエリア名の説明,規則については,単一列一意性制約定義のPRIMARY KEYのインデクス格納用RDエリア名の説明を参照してください。

マトリクス分割インデクス格納用RDエリア指定::=2次元格納用RDエリア指定

マトリクス分割表を定義する場合に指定します。

指定方法については,PARTITIONED BY MULTIDIMの2次元格納用RDエリア指定の説明を参照してください。また,指定するRDエリアについては,複数列一意性制約定義の〔{UNIQUE|PRIMARY}〕 CLUSTER KEYのインデクス格納用RDエリア名の説明を参照してください。

(w) 複数列検査制約定義::=CHECK(探索条件)

複数の列に対して検査制約を定義する場合に指定します。

探索条件

複数の列を制約する条件を指定します。この条件が偽になる場合,この表に対して挿入,更新はできません。

探索条件中に指定する列は,表定義で指定した列を指定してください。

探索条件中の制限は,「単一列検査制約定義」の「探索条件」を参照してください。

(x) 複数列参照制約定義::=FOREIGN KEY(列名〔,列名〕…) 参照指定

複数列を外部キーとして定義する場合に指定します。

外部キーについての規則を次に示します。

  1. 外部キーを指定した場合,それらを構成する列には,次に示すデータ型は指定できません。

    • BLOB

    • BINARY

    • 抽象データ型

  2. 外部キーを構成する列には,繰返し列は指定できません。

  3. 外部キーを構成する列には,予備列は指定できません。

  4. 外部キーと参照する主キーは次に示す事項をすべて同じにしてください。

    • 対応するデータ型

    • 対応するデータ長

    • 列数

    なお,外部キーとして複数の列を指定した場合,HiRDBは指定順に列の対応をチェックします。

FOREIGN KEY(列名〔,列名〕…) 参照指定

外部キーを構成する列名を指定します。

列名は最大64個指定できます。

列名は同じ列名を指定できません。

(y) 格納条件::=列名{=|<>|^=|!=|<|<=|>|>=}{定数|(定数〔,定数〕)}

表を複数のRDエリアに分割(表の横分割)して格納するための条件を指定します。

格納条件についての規則を次に示します。

  1. 定数を複数個指定できるのは,比較演算子で=を用いた場合だけです。

  2. 定数を複数個指定する場合,同じ値は指定しないでください。

  3. 比較演算できる列のデータ型を次に示します。

    • INTEGER

    • SMALLINT

    • DECIMAL

    • FLOAT

    • SMALLFLT

    • CHARACTER※1

    • VARCHAR※1

    • NCHAR※2

    • NVARCHAR※2

    • MCHAR※1

    • MVARCHAR※1

    • DATE

    • TIME

    • TIMESTAMP※4

    • INTERVAL YEAR TO DAY※3

    • INTERVAL HOUR TO SECOND※3

    注※1

    定義長が255バイト以下の列だけ指定できます。

    注※2

    定義長が127文字以下の列だけ指定できます。

    注※3

    データディクショナリ表SQL_DIV_TABLE中のDCVALUES列(格納振り分け条件値)には,補正した値が格納されます。

    (例)

    19921225. → 19930025.

    99981315. → 99990115.

    注※4

    DEFAULT句中にUSING BESを含む既定値を指定した場合は指定できません。

  4. 定数には,次のものは指定できません。

    • 長さ0の文字列定数,各国文字列定数,混在文字列定数,及び16進文字列定数

    • 長さ256バイト以上の文字列定数,長さ128文字以上の各国文字列定数,長さ256バイト以上の混在文字列定数,及び長さ256バイト以上の16進文字列定数(16進文字列の文字数512文字以上)

  5. 列名で指定した列の値は更新できません。

  6. 一つの格納条件に指定する定数の数は,すべての格納条件に指定した定数の総数が15,000以下の範囲で指定してください。ただし,格納条件を省略した場合も1と数えます。

  7. クラスタキーを指定した列がある場合,それ以外の列に対して格納条件を指定できません。

  8. 列名で指定した列はNOT NULL(非ナル値制約,FIX指定,クラスタキー,又は主キー)にしてください。

  9. クラスタキーが複数列の場合,先頭の列名以外の列に対して格納条件は指定できません。

  10. 繰返し列には,格納条件を指定できません。

  11. 予備列には,格納条件を指定できません。

(z) ハッシュ関数名::={HASH1|HASH2|HASH3|HASH4|HASH5|HASH6|HASHZ|HASH0|HASHA|HASHB|HASHC|HASHD|HASHE|HASHF}

リバランス表でない場合,又はマトリクス分割表の第2次元にハッシュ関数を指定する場合:

HASH1〜HASH6,HASHZ,又はHASH0のどれかを指定してください。

HASH6が最も均等にハッシングされるので,通常はHASH6を指定してください。ただし,分割キーのデータによっては均等にならない場合もあるので,そのときにはほかのハッシュ関数を指定してください。

HASH0は年月の値で,データ格納先RDエリアを月単位に循環させる場合に指定してください。

HASHZは年月日の値で,データ格納先RDエリアを日単位に循環させる場合に指定してください。

HASH0とHASHZの使い分け

運用方法

推奨

月単位で分割する

HASH0

日単位で分割する

HASHZ

リバランス表の場合:

HASHA〜HASHFのどれかを指定してください。

HASHFが最も均等にハッシングされるので,通常はHASHFを指定してください。ただし,分割キーのデータによっては均等にならない場合もあるので,そのときにはほかのハッシュ関数を指定してください。

HASH1,HASHA

このハッシュ関数は,分割に指定した列のすべてのデータ型に使用できます。分割に指定したすべての列のデータの全バイトを使用してハッシュします。データ長が0バイト以上の列に指定できます。

HASH2HASHB

このハッシュ関数は,分割に指定した列のすべてのデータ型に使用できます。分割に指定したすべての列のデータの全バイトを使用してハッシュします。データ長が0バイト以上の列に指定できます。

HASH1又はHASHAを指定してデータを均等にRDエリアに格納できなかった場合に指定します。

HASH3HASHC

このハッシュ関数は,分割に指定した列のデータ型がINTEGER,又はSMALLINT専用です。分割したすべての列の末尾2バイトを使用してハッシュします。データ長が2バイト以上の列に指定できます。

HASH4HASHD

このハッシュ関数は,分割に指定した列のデータ型がDATE専用です。分割に指定したすべての列の先頭4バイトを使用してハッシュします。データ長が4バイト以上の列に指定できます。

HASH5HASHE

このハッシュ関数は,分割に指定した列のデータ型がTIME専用です。分割に指定したすべての列の先頭3バイトを使用してハッシュします。データ長が3バイト以上の列に指定できます。

HASH6HASHF

このハッシュ関数は,分割に指定した列のすべてのデータ型に使用できます。DECIMALの場合に最も適しています。分割に指定したすべての列の,データの全バイトを使用してハッシュします。データ長が0バイト以上の列に指定できます。

HASHZ

このハッシュ関数は,分割列中の年月日の値を使用してハッシングし,データを格納するRDエリアを日単位で循環させて割り当てる場合に使用します。

このハッシュ関数を指定する場合には,分割キーは1列で,そのデータ型はDATE,TIMESTAMP,CHAR(8)(文字集合がUTF16の場合はCHAR(16))でなければなりません。文字の長さが8文字の場合の文字形式は,'YYYYMMDD'にしてください。

また,YYYY,MM,及びDDは,次の値にしてください。

 YYYY:0001〜9999(年)

 MM:01〜12(月)

 DD:01〜該当年月の最終日(日)

HASH0

このハッシュ関数は,分割列中の年月の値を使用してハッシングし,データを格納するRDエリアを月単位で循環させて割り当てる場合に使用します。

このハッシュ関数を指定する場合には,分割キーは1列で,そのデータ型はDATE,TIMESTAMP,CHAR(8)(文字集合がUTF16の場合はCHAR(16)),又はCHAR(6)(文字集合がUTF16の場合はCHAR(12))でなければなりません。文字の長さが8文字の場合の文字形式は,'YYYYMMDD',文字の長さが6文字の場合の文字形式は,'YYYYMM'にしてください。

また,YYYY,MM,及びDDは,次の値にしてください。

 YYYY:0001〜9999(年)

 MM:01〜12(月)

 DD:01〜該当年月の最終日(日)

注※

VARCHAR型,MVARCHAR型,又はNVARCHAR型は,後続の空白を無視してハッシュします。また,DECIMAL型,INTERVAL YEAR TO DAY型,又はINTERVAL HOUR TO SECOND型で符号部が'F'の場合は,'C'に変換してハッシュします。

(aa) 参照指定::=REFERENCES 被参照表 〔参照制約動作指定〕

参照する被参照表を指定します。制約動作を指定したい場合は参照制約動作指定を指定します。

参照指定を指定した場合,参照指定を指定した表(参照表)は,次の表に示す操作規則が適用されます。参照指定を指定した表が参照する表(被参照表)には,表「CASCADE指定時の被参照表に対する操作,及びそれに伴う参照表への影響」及び表「RESTRICT指定時の被参照表に対する操作」に示す操作規則が適用されます。

表3‒28 参照指定指定時の参照表に対する操作

外部キー構成列に対する操作

外部キー構成列の行と,外部キーが参照する被参照表の行の関係

操作結果

追加(INSERT)

挿入する行の外部キー構成列の値と等しい主キー構成列の値を持つ行が被参照表中に存在する。

挿入する行の外部キー構成列の値と等しい主キー構成列の値を持つ行が被参照表中に存在しない。

挿入する行の外部キー構成列中にナル値がある。

挿入する行の外部キー構成列中にナル値がない。

×

更新(UPDATE)

更新後の外部キー構成列の値と等しい主キー構成列の値を持つ行が被参照表中に存在する。

更新後の外部キー構成列の値と等しい主キー構成列の値を持つ行が被参照表中に存在しない。

更新後の外部キー構成列中にナル値がある。

更新後の外部キー構成列中にナル値がない。

×

(凡例)

○:参照表に対する操作ができます。

×:制約違反エラーとなります。

被参照表::=表名

参照する表名を指定します。

表名の規則を次に示します。

  • 主キーを持つ表の表名を指定してください。

  • 表名は実表にしてください。

  • 自分の所有する表を指定してください。

  • 定義する表識別子は指定できません。

参照制約動作指定::={削除動作〔更新動作〕|更新動作〔削除動作〕}

主キーの更新,削除に同期して行われる外部キーに対する動作を指定します。

削除動作::=ON DELETE 参照動作

被参照表の行を削除したときの動作を指定します。

更新動作::=ON UPDATE 参照動作

被参照表の行を更新したときの動作を指定します。

参照動作

CASCADE

データの整合性を保つため,主キーに対する操作を外部キーに伝える場合に指定します。

被参照表に対する操作,及びそれに伴う参照表への影響を次の表に示します。

表3‒29 CASCADE指定時の被参照表に対する操作,及びそれに伴う参照表への影響

外部キー構成列が参照する被参照表の主キー構成列に対する操作

外部キー構成列の行と外部キーが参照する被参照表の行の関係

参照表に対する影響

削除(DELETE)

削除する行の主キー構成列の値と等しい外部キー構成列の値を持つ行が参照表に存在する。

行削除

削除する行の主キー構成列の値と等しい外部キー構成列の値を持つ行が参照表に存在しない。

影響しない

更新(UPDATE)

更新前の主キー構成列の値と等しい外部キー構成列の値を持つ行が参照表に存在する。

主キーと等しい値で更新

更新前の主キー構成列の値と等しい外部キー構成列の値を持つ行が参照表に存在しない。

影響しない

RESTRICT

主キーに対する操作が外部キーに影響を与えるかどうかチェックして,データの整合性を維持するように操作を制約する場合に指定します。

被参照表に対する操作を次の表に示します。

表3‒30 RESTRICT指定時の被参照表に対する操作

外部キー構成列が参照する被参照表の主キー構成列に対する操作

外部キー構成列の行と外部キーが参照する被参照表の行の関係

操作結果

削除(DELETE)

削除する行の主キー構成列の値と等しい外部キー構成列の値を持つ行が参照表に存在する。

×

削除する行の主キー構成列の値と等しい外部キー構成列の値を持つ行が参照表に存在しない。

更新(UPDATE)

更新前の主キー構成列の値と等しい外部キー構成列の値を持つ行が参照表に存在する。

×

更新前の主キー構成列の値と等しい外部キー構成列の値を持つ行が参照表に存在しない。

(凡例)

○:被参照表に対する操作ができます。

×:制約違反エラーとなります。

参照制約動作自体を省略した場合は,ON DELETE RESTRICT ON UPDATE RESTRICTを仮定します。

削除指定を省略した場合はON DELETE RESTRICT,更新指定を省略した場合はON UPDATE RESTRICTを仮定します。

参照制約動作にCASCADEを指定した場合,HiRDBが制約操作を行うためのトリガを生成します。

作成するトリガの名称を次の表に示します。なお,トリガの名称の長さは共に21バイトです。

表3‒31 HiRDBが作成するトリガの名称

参照制約動作

トリガ名称

削除動作

(DRAyyyymmddhhmmssth)

更新動作

(URAyyyymmddhhmmssth)

注 yyyymmddhhmmssthは,トリガ生成時のタイムスタンプです(100分の1秒単位までの情報を持ちます)。参照動作がCASCADEの参照制約を指定した表を連続して定義すると,作成するトリガの名称が同じ名称になり,KFPA11803-Eエラーが発生することがあります。この場合は,エラーが発生した表定義を再度実行してください。

また,トリガのSQLコンパイルオプションは,トリガ定義でSQLコンパイルオプションを省略した場合の値と同じです。省略時の値については「CREATE TRIGGER(トリガ定義)」を参照してください。

外部キーが複数指定された場合は,次に示す順序で制約が行われます。

  1. CASCADE

  2. RESTRICT

CASCADEを複数指定した場合,表に指定した順にCASCADEの制約を行います。

RESTRICTを複数指定した場合,最適な制約チェックができるように,HiRDBが制約を行う順序を決定し,その順序で制約を行います。

(ab) 制約名定義::=CONSTRAINT 制約名

指定した制約に対して,制約名を定義する場合に指定します。

制約名

スキーマ内で同一制約名は指定できません。

制約名を省略した場合,HiRDBが制約名を仮定します。

HiRDBが仮定する制約名を次の表に示します。

表3‒32 制約名省略時にHiRDBが仮定する制約名

種類

制約名

備考

参照制約

単一列

参照制約定義

制約を指定する列名

なし

複数列

参照制約定義

外部キーに指定した最初の列名

なし

検査制約

CK_表番号_yyyymmddhhmmssth

30文字固定(表番号10文字,時刻16文字)

注 yyyymmddhhmmssthは,制約定義時のタイムスタンプです(100分の1秒単位までの情報を持ちます)。

表番号は,10文字で右詰め,先頭から0が埋められた値です。

ユーザが制約名を指定する場合は,重複する可能性があるため,上記のような形式の制約名は指定しないでください。

(ac) WITH PROGRAM

外部キーを定義する場合,該当する手続き,及びトリガの有効なSQLオブジェクトを無効にする場合に指定します。外部キーを定義しない場合,WITH PROGRAMの指定は無視します。無効になるオブジェクトを次の表に示します。

表3‒33 無効になるオブジェクト

作成バージョン

オブジェクトの内容

オブジェクトの種類

無効になる条件

07-00以降

手続き,及びトリガのオブジェクト

REFERENCESで指定した表を使用したUPDATE文,又はDELETE文を含む場合

07-00より前

REFERENCESで指定した表を使用したSQL文を含む場合

(5) 共通規則

  1. 表は,順序数生成子と合わせて一つのRDエリアに最大500個定義できます。

  2. クラスタキーを定義した列は更新できません。

    ただし,クラスタキーを定義した列に,定義長256バイト以上の可変長文字列(VARCHAR,NVARCHAR,又はMVARCHAR)の列を含む場合は更新できます。クラスタキーを更新すると,更新した行はクラスタリング効果がなくなる可能性があります。

  3. クラスタキーを定義した列にナル値は挿入できません。

  4. クラスタキーを定義した列は更新できません。

  5. 指定するLOB列格納用RDエリア,又はLOB属性格納用RDエリアには,既にほかのBLOB列,又はBLOB属性に割り当てられているRDエリアは指定できません。

  6. 同じ列構成に対してCLUSTER KEY句とPRIMARY KEY句は指定できません。同じ列構成にクラスタキーと主キーを定義したい場合は,PRIMARY CLUSTER KEY句を指定してください。この場合の同じ列構成とは,次の条件をすべて満たすものをいいます。

    • CLUSTER KEY句とPRIMARY KEY句に指定した列名の並び,及び指定した列数が一致している。

    • 昇順,降順の指定がすべて一致しているか,又はすべて逆になっている。

  7. 表格納用RDエリア,LOB列格納用RDエリア,LOB属性格納用RDエリア,及びインデクス格納用RDエリアに,インナレプリカ機能を適用しているRDエリアと適用していないRDエリアは混在して指定できません。インナレプリカ機能を適用しているRDエリアを指定する場合,RDエリア名にはオリジナルRDエリア名を指定します。

  8. インナレプリカ機能を使用している場合のCREATE TABLEの実行条件については,マニュアル「インナレプリカ機能 HiRDB Staticizer Option Version 9」を参照してください。

  9. 次の表に対して,HiRDB Dataextractor,及びHiRDB Datareplicatorを使用したデータ反映はしないでください。

    • 改竄防止表

    • 非ナル値制約を指定し,かつSYSTEM GENERATEDを指定した列がある表

  10. クラスタキー又は主キーを定義すると,定義されるインデクスのインデクス識別子は次の表に示す規則で決定されます。

    表3‒34 定義されるインデクス識別子

    指定項目

    インデクス識別子

    CLUSTER

    (CLUSTER表番号)

    PRIMARY

    (PRIMARY表番号)

    PRIMARY CLUSTER

    (PRI−CLS表番号)

    表番号の部分は10文字の右詰めで,先頭から0が埋められた値になります。

    合計で19文字(このうち9文字は上記に示した括弧と文字)の固定値が指定されます。

  11. 一時表を定義する場合,格納用RDエリアは指定できません。

  12. 列は一つの表に最大30,000個定義できます。

    また,列の長さ(データ長)の合計が,次の式を満たす必要があります。各列の長さ(データ長)を次の表に示します。

    • FIX指定のない表(表操作時)

      [図データ]

    • FIX指定のある表(表定義時)

      [図データ]

      表3‒35 既定義型データ長一覧

      分類

      データ型及び条件

      データ長(単位:バイト)

      数値データ

      INTEGER

      4

      SMALLINT

      2

      LARGE DECIMAL(m,n)※1

      ↓m÷2↓

      +1※2

      FLOAT又はDOUBLE PRECISION

      8

      SMALLFLT又はREAL

      4

      文字データ

      CHARACTER(n)

      n※3

      VARCHAR(n)

      d≦255

      繰返し列の要素

      d+2

      上記以外

      d+1

      d≧256

      6

      VARCHAR(n)

      ノースプリットオプション指定あり

      n≦255

      抽象データ型の属性

      d+3

      繰返し列の要素

      d+2

      上記以外

      d+1

      n≧256

      6

      各国文字データ

      NCHAR(n)又はNATIONAL CHARACTER(n)

      2×n ※4

      NVARCHAR(n)

      d≦127

      繰返し列の要素

      2×d+2

      上記以外

      2×d+1

      d≧128

      6

      NVARCHAR(n)

      ノースプリットオプション指定あり

      n≦127

      抽象データ型の属性

      2×d+3

      繰返し列の要素

      2×d+2

      上記以外

      2×d+1

      n≧128

      6

      混在文字データ

      MCHAR(n)

      n※3

      MVARCHAR(n)

      d≦255

      繰返し列の要素

      d+2

      上記以外

      d+1

      d≧256

      6

      MVARCHAR(n)

      ノースプリットオプション指定あり

      n≦255

      抽象データ型の属性

      d+3

      繰返し列の要素

      d+2

      それ以外

      d+1

      n≧256

      6

      日付データ

      DATE

      4

      時刻データ

      TIME

      3

      時刻印データ

      TIMESTAMP(n)

      7+(n÷2)

      日間隔データ

      INTERVAL YEAR TO DAY

      5

      時間隔データ

      INTERVAL HOUR TO SECOND

      4

      長大データ

      BLOB

      9

      バイナリデータ

      BINARY(n)

      n≦255

      d+3

      n≧256

      15

(凡例)

d:実際のデータ長(文字数)

m,n:正の整数

注※1

全体のけた数がmけたで,小数点以下のけた数がnけたの固定小数点数です。mを省略した場合は15を仮定します。

注※2

表定義時に表オプションにSUPPRESS DECIMALを指定した場合,データ長は「↓k÷2↓+2」になります。kは,格納時の有効けた数(先頭の0の部分を除いたけた数)を示します。なお,次に示す場合はSUPPRESS DECIMALを使用しないでください。計算式中のaは,SUPPRESS DECIMAL又は列データ抑制指定を使用しない場合の,表中の列のデータ長の合計値です。

32717<(a+表中の列数×2+8)

注※3

列データ抑制指定をして,データ抑制された場合,nは「n−b+4」になります。なお,データ抑制は,列データ抑制指定時,列データの最後の文字が空白の場合,その最後の文字と連続している半角の空白が4文字以上あるときだけ実行されます。bは,列データの最後の文字と連続している空白の数を示します。

ただし,列データ抑制指定をして,データ抑制されなかった場合は,列ごとに1バイトの付加情報が追加されます。

なお,次に示す場合は列データ抑制指定を使用しないでください。計算式中のaは,SUPPRESS DECIMAL又は列データ抑制指定を使用しない場合の,表中の列のデータ長の合計値です。

32717<(a+表中の列数×2+8)

注※4

列データ抑制指定をして,データ抑制された場合,2×nは「2×n−2×b+5」になります。なお,データ抑制は,列データ抑制指定時,列データの最後の文字が空白の場合,その最後の文字と連続している全角の空白が3文字以上あるときだけ実行されます。bは,列データの最後の文字と連続している空白の数を示します。

ただし,列データ抑制指定をして,データ抑制されなかった場合は,列ごとに1バイトの付加情報が追加されます。

なお,次に示す場合は列データ抑制指定を使用しないでください。計算式中のaは,SUPPRESS DECIMAL又は列データ抑制指定を使用しない場合の,表中の列のデータ長の合計値です。

32717<(a+表中の列数×2+8)

(6) 参照制約に関する規則

  1. 同じ外部キー構成列(並びが同じでなくてもよい)の外部キーから,同じ被参照表を参照することはできません。

  2. WITHOUT ROLLBACKを指定して定義した表には外部キーを指定できません。

  3. WITHOUT ROLLBACKを指定して定義した表に主キーがある場合,その主キーを参照する外部キーを定義できません。

  4. 共用表には外部キーを指定できません。

  5. 改竄防止表には外部キーを指定できません。

  6. 外部キーは一つの表に最大255個定義できます。

  7. 一つの主キーには最大255個外部キーが定義できます。

  8. 外部キーの文字集合と,その外部キーから参照される表の主キーの文字集合は同じにしてください。

  9. 一時表には外部キーを指定できません。

  10. 被参照表が一時表である参照表には,外部キーを指定できません。

(7) 検査制約に関する規則

  1. 表中に定義できる検査制約は最大254個です。一つの表で検査制約中で指定した論理演算子の数(CASE式のWHEN探索条件中のAND,ORを除く,AND及びORの数)と検査制約の数の合計(検査制約制限値と呼ぶ)も最大254個です。

  2. 複数の条件を指定する場合は,複数の条件をまとめて一つの検査制約を定義しないで,複数に分けて検査制約を定義することを推奨します。これによって,制約違反となった場合に,違反となった条件を制約名から容易に判別できます。

  3. 改竄防止表には検査制約定義を指定できません。

  4. 検査制約の探索条件にBLOB型を指定する場合,又は定義長が32,001バイト以上のBINARY型の列を指定する場合,次のSQLを実行できません。

    • 検査制約の探索条件に指定したBLOB型,又は定義長が32,001バイト以上のBINARY型の列に対するUPDATE文での連結演算による更新

  5. 一時表には検査制約を定義できません。

(8) 留意事項

  1. CREATE TABLEは,OLTP下のX/Openに従ったUAPから指定できません。

  2. 表の未使用領域の比率,及びセグメント内空きページ比率の両方に0%を指定する場合,PCTFREE=(0,0)を指定してください。

  3. 行単位インタフェースを使用して,日付データをCHAR(10)で受け渡しする場合は,日付けデータ型を使用しないで,CHAR(10)で列を定義してください。

  4. 行単位インタフェースを使用して,時刻データをCHAR(8)で受け渡しする場合は,時刻データ型を使用しないで,CHAR(8)で列を定義してください。

  5. 行単位インタフェースを使用して,時刻印データを19,22,24,又は26バイトのCHARで受け渡しをする場合,時刻印データ型を使用しないで19,22,24,又は26バイトのCHARで列を指定してください。

  6. 改竄防止表を定義する場合,表格納用RDエリアには改竄防止表だけを格納することをお勧めします。改竄防止表に対するpdrorgが異常終了した場合,再編成が完了するまでそのRDエリアは閉塞が解除できません。そのため,改竄防止表が格納されているRDエリアにほかの表,及びインデクスがあると,それらも使用できなくなります。

  7. 参照動作にCASCADEを指定した参照表に対して表定義変更などを行った場合,HiRDBが生成した制約操作を行うためのトリガが無効になる場合があります。次にトリガが無効になる条件を示します。

    • 参照制約動作指定がON UPDATE CASCADEの場合に生成するトリガが,無効となる条件

      ・参照表に対して表定義変更(列に対するSPLITの変更,列に対する既定値の変更)を行った場合

      ・参照表に対してインデクスを定義した場合

      ・参照表のインデクスを削除した場合

      ・参照表に対して,トリガ契機がUPDATEのトリガを定義した場合

      ・参照表に定義したトリガ契機がUPDATEのトリガを削除した場合

      ・参照表が参照する被参照表の主キー構成列に対して,表定義変更を行った場合

    • 参照制約動作指定がON DELETE CASCADEの場合に生成するトリガが,無効となる条件

      ・参照表に対して表定義変更(列に対するSPLITの変更,列に対する既定値の変更)を行った場合

      ・参照表に対してインデクスを定義した場合

      ・参照表のインデクスを削除した場合

      ・参照表に対して,トリガ契機がDELETEのトリガを定義した場合

      ・参照表に定義したトリガ契機がDELETEのトリガを削除した場合

      無効になったトリガは,ALTER ROUTINEを使用して再作成してください。

  8. 参照動作としてON UPDATE CASCADEを指定した参照制約を複数指定する場合は,被参照表に同一表名を指定しないでください。

    ただし,以下に示す条件をすべて満たす場合を除きます。

    • 該当する複数の参照指定の外部キー構成列が重複していない。

    • 該当する複数の参照指定の外部キー構成列に関連する検査制約,参照制約を定義していない。

(9) 使用例

  1. 在庫表(ZAIKO)を定義します。

      CREATE TABLE ZAIKO
          (SCODE CHAR(4),SNAME NCHAR(8),
          COL NCHAR(1),TANKA INTEGER,ZSURYO INTEGER)
  2. 在庫表(ZAIKO)を次に示す条件で定義します。

    • FIX表にします。

    • 表データはユーザ用RDエリア(RDA1)に格納します。

    • 在庫表はクラスタキーのないFIX表のため,未使用領域の比率,及びセグメント内の空きページ比率を0%に指定します。

      CREATE FIX TABLE ZAIKO
         (SCODE CHAR(4),SNAME NCHAR(8),
         COL NCHAR(1),TANKA INTEGER,ZSURYO INTEGER)
       IN RDA1
       PCTFREE=(0,0)
  3. 在庫表(ZAIKO)を次に示す条件で定義します。

    • 商品コード(SCODE)列を一意性制約のあるクラスタキーとして定義します。

    • 表データ,及びインデクスをそれぞれ三つのRDエリアに分割して格納します。格納条件は次のとおりとします。

      格納条件

      格納するRDエリア

      表データ

      インデクス

      101M ≦ SCODE ≦ 202M

      RDA1

      RDA4

      302S ≦ SCODE ≦ 412M

      RDA2

      RDA5

      591L ≦ SCODE ≦ 591S

      RDA3

      RDA6

      CREATE TABLE ZAIKO
          (SCODE CHAR(4)
              UNIQUE CLUSTER KEY ASC
              IN ((RDA4),(RDA5),(RDA6)),
          SNAME NCHAR(8),
          COL   NCHAR(1),
          TANKA INTEGER,
          ZSURYO INTEGER)
        IN ((RDA1)SCODE<='202M',
            (RDA2)SCODE<='412M',
            (RDA3))
  4. 在庫表(ZAIKO)を次に示す条件で定義します。

    • 商品名(SNAME)列,及び色(COL)列をクラスタキーとして定義します。

    • クラスタキーのインデクスは,商品名の昇順,色の降順にします。

    • 表データは,ユーザ用RDエリア(RDA1)に格納します。

    • インデクスは,ユーザ用RDエリア(RDA2)に格納します。

      CREATE TABLE ZAIKO
          (SCODE CHAR(4),SNAME NCHAR(8),
          COL NCHAR(1),TANKA INTEGER,ZSURYO INTEGER)
       IN RDA1
       CLUSTER KEY (SNAME ASC,COL DESC) IN RDA2
  5. 抽象データ型t_従業員を含む社員表を定義します。

      CREATE TABLE 社員表
          (社員No INTEGER NOT NULL,
           文書データ BLOB (6000) IN ((LRDA1),(LRDA2)),
           従業員 t_従業員 ALLOCATE(顔写真
             IN ((LRDA03),(LRDA04))))
             IN ((RDA1)社員No<=700000,(RDA2))
  6. 受注表(JUTYU)を,次の条件で定義します。

    • 改竄防止表とする。

    • 行削除禁止期間を10年とする。

    • 挿入履歴保持列として,JINSERTDATE列を定義する。

      CREATE TABLE JUTYU
          (DNO CHAR(6),TCODE CHAR(5),SCODE CHAR(4),
           JSURYO INTEGER,JDATE DATE,JTIME TIME,
           JINSERTDATE DATE NOT NULL WITH DEFAULT SYSTEM GENERATED)
       INSERT ONLY WHILE 10 YEARS BY JINSERTDATE
  7. 在庫表(ZAIKO)を次に示す条件で定義します。

    • マトリクス分割表として,6個のユーザ用RDエリアに分割して格納します。

    • 格納条件を次に示します。

      格納条件

      格納するRDエリア

      SCODE≦202M AND TANKA≦5000

      RDA1

      SCODE≦202M AND TANKA>5000

      RDA2

      202M<SCODE≦412M AND TANKA≦5000

      RDA3

      202M<SCODE≦412M AND TANKA>5000

      RDA4

      SCODE>412M AND TANKA≦5000

      RDA5

      SCODE>412M AND TANKA>5000

      RDA6

      CREATE TABLE ZAIKO
          (SCODE CHAR(4) NOT NULL,
           TANKA INTEGER NOT NULL)
        PARTITIONED BY MULTIDIM (SCODE(('202M'),('412M')),
                                 TANKA((5000)))
        IN ((RDA1,RDA2),(RDA3,RDA4),(RDA5,RDA6))
  8. 在庫表(ZAIKO)を次に示す条件で定義します。

    • 商品コード(SCODE)列にサイズがS,M,L以外の商品で挿入・更新できないように検査制約を定義します。

      CREATE TABLE ZAIKO
          (SCODE CHAR(4) CONSTRAINT CHECK_SIZE
    CHECK(SCODE LIKE '%S' OR SCODE LIKE '%M' OR SCODE LIKE '%L'),
    SNAME NCHAR(8),
          COL NCHAR(1),TANKA INTEGER,ZSURYO INTEGER)
  9. 単一の列に参照制約を定義します。

    • 部名表の行を削除した場合,名前表に対応する行も削除します。

    被参照表(部名表(DEPT1))を定義し,主キーを部コード(DNO)列にします。
      CREATE TABLE DEPT1
          (DNO CHAR(3) PRIMARY KEY,DNAME NVARCHAR(20),MGR CHAR(8))
     
    参照表(氏名表(EMP1))を定義し,外部キーを部コード(DNO)列にします。
     CREATE TABLE EMP1
       (ENO CHAR(8),ENAME NVARCHAR(25),
        DNO CHAR(3)
               CONSTRAINT EMP1_K REFERENCES DEPT1 ON DELETE CASCADE)

    [図データ]

  10. 複数の列に参照制約を定義します。

    • 課名表の行を削除した場合,名前表の行に,削除する課名表の行と同じ値がある場合,課名表の削除を抑止します。また,課名表の行を更新する場合,名前表の行に,更新する課名表の行と同じ値がある場合,課名表の更新を抑止します。

    被参照表(課名表(DEPT2))を定義し,主キーを部コード(DNO)列,課コード(SNO)列にします。
      CREATE TABLE DEPT2
          (DNO CHAR(3),SNO CHAR(3),SNAME CHAR(20),CHIEF CHAR(8),
          PRIMARY KEY(DNO,SNO))
     
    参照表(氏名表(EMP2))を定義し,外部キーを部コード(DNO)列,課コード(SNO)列にします。
     CREATE TABLE EMP2
       (ENO CHAR(8),ENAME CHAR(25),DNO CHAR(3),SNO CHAR(3),
       CONSTRAINT EMP2_K FOREIGN KEY(DNO,SNO) REFERENCES DEPT2)

    [図データ]