ALTER TABLE

ALTER TABLE文は、既存の表定義を変更します。

ALTER TABLE文は、TimesTen ScaleoutおよびTimesTen Classicでサポートされています。ただし、構文とセマンティクスでは違いがあります。わかりやすくするために、サポートされている構文、パラメータ、説明(セマンティクス)およびTimesTen ScaleoutとTimesTen Classicの例は、TimesTen Scaleoutでの使用方法とTimesTen Classicでの使用方法に分けられています。使用方法に繰返しがありますが、構文からパラメータへ進み、セマンティクスから各使用方法の例に進むことができるように、このような方法で示されています。

必要な権限セクションを確認してから、次を確認してください。

必要な権限

表の所有者に必要な権限はありません。

別のユーザーの表の場合はALTER ANY TABLEが必要です。

ALTER TABLE...ADD FOREIGN KEYの場合、変更される表の所有者に、外部キー句で参照される表のREFERENCES権限が必要です。

この項を確認した後、次を参照してください。

ALTER TABLEのSQL構文: TimesTen Scaleout

TimesTen Scaleoutでの分散キーの変更:

ALTER TABLE [Owner.]TableName DistributionClause;

主キー制約を追加して、オプションでグローバル索引またはローカル索引を指定するには:

ノート: (CreateIndexStmt)は、TimesTenのCREATE INDEX文を表すために使用する句です。カッコ( )が必要です。主キー制約の要件に応じて、一意索引を作成する必要があります。詳細は、「CREATE INDEX」を参照してください。

ALTER TABLE [Owner.]TableName ADD CONSTRAINT ConstraintName
  PRIMARY KEY (ColumnName [,... ]) [(UsingIndexClause2)];

UsingIndexClause2::= USING INDEX {GLOBAL|LOCAL} [USE HASH INDEX PAGES=RowPages|CURRENT]|
USING INDEX (CreateIndexStmt)

ノート:

ALTER TABLEを使用して主キー制約を削除することはできません。制約を削除するには、表を削除してから再作成する必要があります。

列に一意制約を追加して、オプションでグローバル索引またはローカル索引を指定するには:

ノート: (CreateIndexStmt)は、TimesTenのCREATE INDEX文を表すために使用する句です。カッコ( )が必要です。一意制約の要件に応じて、一意索引を作成する必要があります。詳細は、「CREATE INDEX」を参照してください。

ALTER TABLE Owner.]TableName
ADD UNIQUE (ColumnName)
[UsingIndexClause1];

UsingIndexClause1::= USING INDEX {GLOBAL | LOCAL}| USING INDEX (CreateIndexStmt)

1つの列の追加:

ALTER TABLE [Owner.]TableName 
  ADD [COLUMN] ColumnName ColumnDataType
    [DEFAULT DefaultVal] [[NOT] INLINE] [UNIQUE] [NULL]
  [COMPRESS (CompressColumns [,...])];

複数の列の追加:

ALTER TABLE [Owner.]TableName 
 ADD (ColumnName ColumnDataType 
     [DEFAULT DefaultVal] [[NOT] INLINE] [UNIQUE] [NULL] [,... ] );

NOT NULL列の追加(注意: DEFAULT句が必要):

ALTER TABLE [Owner.]TableName
  ADD [COLUMN] ColumnName ColumnDataType
    NOT NULL [ENABLE] DEFAULT DefaultVal [[NOT] INLINE] [UNIQUE];

複数のNOT NULL列の追加(注意: DEFAULT句が必要):

ALTER TABLE [Owner.]TableName
ADD (ColumnName ColumnDataType
  NOT NULL [ENABLE] DEFAULT DefaultVal [[NOT] INLINE] [UNIQUE] [,...]);

列の削除。

ALTER TABLE [Owner.]TableName 
DROP {[COLUMN] ColumnName | (ColumnName [,... ] )};

外部キーおよびON DELETE CASCADE(オプション)の追加:

ALTER TABLE [Owner.]TableName 
ADD [CONSTRAINT ForeignKeyName] 
  FOREIGN KEY (ColumnName [,...]) REFERENCES RefTableName
    [(ColumnName [,...])] [ON DELETE CASCADE];

外部キーの削除:

ALTER TABLE [Owner.]TableName 
DROP CONSTRAINT ForeignKeyName;

ハッシュ索引のサイズ変更:

ALTER TABLE [Owner.]TableName SET PAGES = RowPages | CURRENT;

主キーで使用する索引をハッシュ索引に変更:

ALTER TABLE [Owner.]TableName
USE HASH INDEX PAGES = RowPages | CURRENT;

主キーで使用する索引をUSE RANGE INDEX句で範囲索引に変更するには、次のように実行します。

ALTER TABLE [Owner.]TableName USE RANGE INDEX;

列のデフォルト値の変更:

ALTER TABLE [Owner.]TableName
MODIFY (ColumnName DEFAULT DefaultVal);

列の一意制約を削除するには:

ALTER TABLE Owner.]TableName DROP UNIQUE (ColumnName);

NULL値可能な列のデフォルト値をNULLに変更することによるデフォルト値の削除:

ALTER TABLE [Owner.]TableName MODIFY (ColumnName DEFAULT NULL);

ALTER TABLE ADD CONSTRAINT PRIMARY KEYのパラメータ: TimesTen Scaleout

パラメータ 説明
ALTER TABLE [Owner.]TableName ALTER TABLE文の冒頭部分。表の名前は必須です。所有者はオプションです。
ADD CONSTRAINT ConstraintName PRIMARY KEY 主キー制約の追加によって表が変更されることを示す句。ConstraintNameは、制約の名前です。主キー制約は追加すると削除できなくなります。表を削除する必要があります。
(ColumnName [,…]) (ColumnName)は必須です。主キー制約に使用する列を指定します。
[UsingIndexClause2] UsingIndexClause2はオプションです。説明は、この表の残りの部分に示します。ALTER TABLEの定義には、2つのUSING INDEX句を指定できません。
USING INDEX {GLOBAL|LOCAL} [UsingIndexClause2]の一部: 指定することで、主キーにグローバル索引またはローカル索引を作成するかどうかを示します。
USE HASH INDEX PAGES = RowPages|CURRENT USING INDEX {GLOBAL|LOCAL}句の一部であり、オプションです。指定することで、主キーに一意のハッシュ索引を作成することを示します。指定しないと、一意の範囲索引が作成されます。グローバル索引とローカル索引の両方に使用できます。

PAGES句は必須です。表に想定されるページ数の値を指定できます。

RowPagesを指定すると、ページ数の値の計算にページの数が使用されます。RowPagesの値は、表の想定行数を256で除算して決定します。たとえば、表に256,000行ある場合は、RowPages1000を指定します(256000/256=1000)。

RowPagesの値は、0を含まない正の定数である必要があります。

CURRENTを指定すると、表内の現在の行数を使用してページ・カウント値が計算されます。

TimesTenでは、表に行がない場合は、PAGES=CURRENTを指定しないことをお薦めします。

USING INDEX (CreateIndexStmt) [UsingIndexClause2]句の一部。このUSING INDEX句が指定されている場合、(CreateIndexStmt)句は、TimesTenのCREATE INDEX文に従って索引を定義することを示します。カッコ( )が必要です。主キー制約の要件に応じて、一意索引を作成する必要があります。CREATE INDEX文の詳細は、「CREATE INDEX」を参照してください。

ALTER TABLE ADD UNIQUE CONSTRAINTのパラメータ: TimesTen Scaleout

パラメータ 説明
ALTER TABLE [Owner.]TableName ALTER TABLE文の冒頭部分。表の名前は必須です。所有者はオプションです。
ADD UNIQUE (ColumnName [,…]) 一意制約の追加によって表が変更されることを示す句。(ColumnName)は必須です。一意制約に使用する列を指定します。
[UsingIndexClause1] UsingIndexClause1はオプションです。説明は、この表の残りの部分に示します。ALTER TABLEの定義には、2つのUSING INDEX句を指定できません。この句を使用すると、PRIMARY KEYに対するグローバル索引またはローカル索引を定義できます
USING INDEX {GLOBAL|LOCAL} [UsingIndexClause1]の一部。指定することで、一意制約にグローバル索引またはローカル索引を作成するかどうかを示します。
USING INDEX (CreateIndexStmt) [UsingIndexClause1]句の一部。このUSING INDEX句が指定されている場合、(CreateIndexStmt)句は、TimesTenのCREATE INDEX文に従って索引を定義することを示します。カッコ( )が必要です。一意制約の要件に応じて、一意索引を作成する必要があります。CREATE INDEX文の詳細は、「CREATE INDEX」を参照してください。

ALTER TABLEの追加パラメータ: TimesTen Scaleout

パラメータ 説明

[Owner.] TableName

変更する表を指定します。

DistributionClause

構文の詳細は、「CREATE TABLE」を参照してください。

UNIQUE

ColumnNameの各行の値が一意である必要があることを示します。

MODIFY

指定した列の属性を新しい値に変更します。

DEFAULT [DefaultVal |NULL]

列がデフォルト値(DefaultVal)を持つことを指定します。NULLを指定すると、列のデフォルト値が削除されます。デフォルト値にSYSDATEを指定した列を追加すると、既存の行の列の値のみが、列が追加された時点のシステム日付になります。デフォルト値がUSER関数の1つである場合、列の値はALTER TABLE文を実行したセッションのユーザーの値になります。現在、ROWIDデータ型のデフォルト値を割り当てることはできません。

列のデフォルト値を変更しても、既存の行は変更されません。

ノート: レプリケーション・スキームの一部である表にNOT NULL列を追加するには、DDL_REPLICATON_LEVELが3以上である必要があります。

ColumnName

ALTER TABLE文に含める列の名前。新しい列に、既存の列または別の新しい列と同じ名前を指定することはできません。NOT NULL列を追加する場合は、DEFAULT句を含める必要があります。

ColumnDataType

追加する列のデータ型です。追加のパラメータが必要なデータ型もあります。指定できるデータ型の詳細は、「データ型」を参照してください。

NOT NULL [ENABLE]

列を追加する場合に、NOT NULLを指定できます。NOT NULLを指定する場合は、DEFAULT句を含める必要があります。任意で、NOT NULL句の後にENABLEを指定できます。NOT NULL制約は常に有効なため、ENABLEの指定は必須ではありません。

INLINE|NOT INLINE

デフォルトでは、宣言された列の長さが128バイトより大きい可変長の列は表外に保存されます。宣言された列の長さが128バイト以下の可変長の列は、表内に保存されます。INLINEおよびNOT INLINEキーワードを使用すると、表を作成するときのデフォルトの動作を無効にすることができます。

CONSTRAINT

外部キーを削除することを指定します。オプションで、追加された外部キーの名前をユーザーが指定するように指定します。

DROP UNIQUE (ColumnName) 一意制約が削除されることを示します。ColumnNameは、制約の名前です。

ForeignKeyName

追加または削除する外部キーの名前です。すべての外部キーは、ユーザーが名前を指定しなかった場合、デフォルトの名前が割り当てられます。ユーザーが指定した名前またはシステムの名前のいずれかをDROP FOREIGN KEY句で指定できます。

FOREIGN KEY

外部キーを追加することを指定します。

REFERENCES

外部キーが別の表を参照することを指定します。

RefTableName

外部キーが参照する表の名前です。

[ON DELETE CASCADE]

ON DELETE CASCADE参照アクションを有効にします。指定されている場合、参照先キーの値を含む行が親表から削除されると、依存する外部キーの値を持つ子表の行も削除されます。

USE HASH INDEX PAGES = RowPages | CURRENT

主キーで使用する索引をハッシュ索引に変更します。主キーですでにハッシュ索引を使用している場合、この句はSET PAGES句と同じです。

USE RANGE INDEX

主キーで使用する索引を範囲索引に変更します。主キーですでに範囲索引を使用している場合、この句は無視されます。

SET PAGES = RowPages | CURRENT

表の想定ページ数に基づいてハッシュ索引のサイズを変更します。CURRENTを指定すると、表内の現在の行数を使用してページ・カウント値が計算されます。RowPagesを指定する場合は、ページ数が使用されます。RowPagesの値は、表の想定行数を256で除算して決定します。たとえば、表に256,000行ある場合は、RowPagesに1000を指定します(256000/256=1000)。

RowPagesの値は、0を含まない正の定数である必要があります。

TimesTenでは、表に行がない場合は、PAGES=CURRENTを指定しないことをお薦めします。

推定した数が小さすぎると、パフォーマンスが悪化します。ハッシュ索引の詳細は、「列定義: TimesTen Scaleout」を参照してください。

ALTER TABLE ADD PRIMARY KEYの説明: TimesTen Scaleout

ALTER TABLEの定義には、PRIMARY KEY句の後に追加の句を指定するオプションがあります。この句を使用すると、主キー制約に対するグローバル索引またはローカル索引を指定できます。
  • USING INDEX {GLOBAL | LOCAL}句は、主キー制約に対するグローバル索引またはローカル索引を指定できるようにする1つのオプションです。GLOBALまたはLOCALのキーワードを指定する必要があります。ハッシュ索引を定義する場合は、USING INDEX {GLOBAL | LOCAL}句の後にオプションでUSE HASH INDEX句を指定できます。

  • USING INDEX (CreateIndexStmt)句は、グローバル索引またはローカル索引を指定する別のオプションです。(CreateIndexStmt)句は、TimesTenのCREATE INDEX文に従って索引を定義することを示します。カッコ( )が必要です。主キー制約の要件に応じて、一意索引を作成する必要があります。CREATE INDEX文の詳細は、「CREATE INDEX」を参照してください。

ノート:

ALTER TABLEの定義では、USING INDEX {GLOBAL | LOCAL}USING INDEX (CreateIndexStmt)の両方を使用することはできません。どちらかの句を指定するか、どちらの句も指定しないでください。

グローバル索引とローカル索引およびそれらのTimesTen Scaleoutでの使用の詳細は、「CREATE INDEX」を参照してください。

ALTER TABLE ADD UNIQUEの説明: TimesTen Scaleout

ALTER TABLEの定義には、UNIQUE句の後に追加の句を指定するオプションがあります。この句を使用すると、一意制約に対するグローバル索引またはローカル索引を指定できます。
  • USING INDEX {GLOBAL | LOCAL}句は、主キー制約に対するグローバル索引またはローカル索引を指定できるようにする1つのオプションです。GLOBALまたはLOCALのキーワードを指定する必要があります。

  • USING INDEX (CreateIndexStmt)句は、グローバル索引またはローカル索引を指定する別のオプションです。(CreateIndexStmt)句は、TimesTenのCREATE INDEX文に従って索引を定義することを示します。カッコ( )が必要です。一意制約の要件に応じて、一意索引を作成する必要があります。CREATE INDEX文の詳細は、「CREATE INDEX」を参照してください。

ノート:

ALTER TABLEの定義では、USING INDEX {GLOBAL | LOCAL}USING INDEX (CreateIndexStmt)の両方を使用することはできません。どちらかの句を指定するか、どちらの句も指定しないでください。

グローバル索引とローカル索引およびそれらのTimesTen Scaleoutでの使用の詳細は、「CREATE INDEX」を参照してください。

ALTER TABLEの追加情報: TimesTen Scaleout

  • 表を変更してデフォルトを変更したり、列と制約を追加および削除できます。ただし、表が空でない場合は、分散スキームを変更できません。また、DISTRIBUTE BY REFERENCE句で指定された制約は削除できません。分散スキームの詳細は、「CREATE TABLE」を参照してください。詳細は、『Oracle TimesTen In-Memory Database Scaleoutユーザーズ・ガイド』「表の変更」を参照してください。

  • ALTER TABLE文を使用して一時表を変更することはできません。

  • ALTER TABLE ADD [COLUMN] ColumnName文は、既存の表に1つ以上の新しい列を追加します。1つ以上の列を追加した場合、新しい列は、新しい1つのパーティション内の表のすべての既存の行の最後に追加されます。

  • マテリアライズド・ビューから参照されている列は削除できません。

  • 列の追加、列の削除、およびキャッシュ・グループ表の制約の追加にALTER TABLE文は使用できません。

  • 追加される列の数に関係なく、1文につき1つのパーティションのみが表に追加されます。

  • 表にALTERを実行して、デフォルト値を持つNOT NULL列を追加します。DEFAULT句は必須です。

    この列を主キー列として使用することはできません。具体的には、ALTER TABLE ADD ConstraintName PRIMARY KEY (ColumnName [,...])文では、その列を指定できないということです。

  • 新しい列に対してデフォルト値が指定されている場合を除き、追加されるすべての列の初期値はNULLです。

  • 表の列の合計数は1000以下です。また、表のパーティションの合計数は1000以下であり、そのうちの1つはTimesTenによって使用されます。

  • グローバル一時表でADD CONSTRAINT ... PRIMARY KEY句を指定しないでください。

  • ALTER TABLE ADD文の結果として、問合せ時に新しい各パーティションに対して追加の読取りが発生します。このため、変更された表のパフォーマンスがわずかに悪化することがあります。パフォーマンスを回復するには、表を削除して再作成するか、またはttMigrate create -c -relaxedUpgradeコマンドを使用してから、ttRestore -r -relaxedUpgradeコマンドを使用して表をリストアします。追加された列を削除しても、悪化したパフォーマンスは回復されず、パーティションの数も減りません。

  • ALTER TABLE DROP文を使用して既存の表から1つ以上の列を削除すると、削除された列は、表の現在のすべての行から削除されます。それ以降のSQL文では、削除した列は使用できなくなります。表の主キーに含まれている列は削除できません。また、表の外部キーに含まれている列も、すべての外部キーを削除しないかぎり削除できません。索引付けされた列は、列の索引をすべて削除しないかぎり削除できません。ALTER TABLEを使用して表の列をすべて削除することはできません。かわりにDROP TABLEを使用します。

  • 表から列が削除された場合、その表を参照するすべてのコマンドを再コンパイルする必要があります。削除された列が参照されると、再コンパイル時にエラーが発生することがあります。アプリケーションはそのコマンドを再度準備し、パラメータと結果列を再作成する必要があります。列が表に追加された場合、SELECT *文を含むコマンドは無効になります。これらのコマンドのみを再度準備する必要があります。その他のすべてのコマンドは、想定したとおりに動作します。

  • 列を削除しても、列の領域は解放されません。

  • UNIQUE制約を追加すると、(領域の増加および処理時間の増加という点で)オーバーヘッドが発生します。これは、UNIQUE制約を維持するための索引が作成されるためです。UNIQUE制約を維持するために使用している索引を、DROP INDEX文を使用して削除することはできません。

  • UNIQUE制約とそれに関連付けられている索引は、レプリケートされた表の一意索引として使用されている場合、削除できません。

  • アプリケーションで表の主キーに対して範囲問合せを実行する場合は、ALTER TABLE...USE RANGE INDEXを使用します。

  • アプリケーションで表の主キーに対して完全一致検索を実行する場合は、ALTER TABLE...USE HASH INDEXを使用します。

  • 表に主キーがない場合、USE HASH INDEX句またはUSE RANGE INDEX句を指定すると、エラーが生成されます。

  • 子表の外部キー制約でON DELETE CASCADEを指定している場合、ユーザーは、子表のDELETE権限を明示的に必要とせずに、DELETE権限を持つ親表から行を削除できます。

  • ON DELETE CASCADEトリガー・アクションを変更するには、外部キー制約を削除して再定義してください。

  • ON DELETE CASCADEは、マテリアライズド・ビューのディテール表でサポートされています。子表に対して定義されたマテリアライズド・ビューがある場合、親表からの削除によって子表でカスケード削除が行われます。つまり、親表での削除により、マテリアライズド・ビューも変更されます。

  • DELETE文によって報告される行の総数には、ON DELETE CASCADEアクションの結果、子表から削除された行は含まれません。

  • ON DELETE CASCADE: 親表から子表へのパスが異なる場合があるため、次のルールが適用されます。

  • 親表から子表へのすべてのパスを、deleteパスかdo not deleteパスのいずれかに統一します。

    • deleteパスのすべての子表でON DELETE CASCADEを指定します。

    • このルールは、1つの親表から複数の子表へ、または複数の親表から1つの子表へのパスには適用されません。

  • ON DELETE CASCADE: 第2のルールも適用されます。

  • ある表にdeleteパスでアクセスする場合、その表のすべての子表にもdeleteパスでアクセスします。

  • ALTER TABLE ADD/DROP CONSTRAINT文には、次の制限があります。

    • 外部キーが削除されると、TimesTenでは外部キーに関連付けられている索引も削除されます。通常のDROP INDEX文を使用して外部キーに関連付けられている索引を削除しようとすると、エラーになります。

    • 外部キーは、ビューまたは一時表では追加または削除できません。

    • ALTER TABLEを使用して主キー制約を削除することはできません。制約を削除するには、表を削除してから再作成する必要があります。

例: TimesTen Scaleoutのグローバル索引を使用した主キー制約の追加

次に示す例は、ALTER TABLE ADD PRIMARY KEYでグローバル索引を使用するための様々な構文の使用を示しています。

表を作成します。表を変更して、主キー制約を追加します。USING INDEX GLOBAL句を指定します。表を削除します。
Command> CREATE TABLE mytab1 (c TT_INTEGER NOT NULL, b TT_INTEGER NOT NULL, 
           a TT_INTEGER NOT NULL) DISTRIBUTE BY HASH (a,b);
Command> ALTER TABLE mytab1 ADD CONSTRAINT pk PRIMARY KEY (c,b) USING INDEX GLOBAL;
Command> indexes mytab1;

Indexes on table SAMPLEUSER.MYTAB1:
  PK: global unique range index on columns:
    C
    B
  1 index found.

1 index found on 1 table.
Command> DROP TABLE mytab1;

表を作成します。表を変更することで主キー制約を追加します。USING INDEX GLOBALUSE HASH INDEX PAGES句とともに指定します。表を削除します。

Command> CREATE TABLE mytab1 (c TT_INTEGER NOT NULL, b TT_INTEGER NOT NULL, 
           a TT_INTEGER NOT NULL) DISTRIBUTE BY HASH (a,b);
Command> ALTER TABLE mytab1 ADD CONSTRAINT pk PRIMARY KEY (c,b) 
           USING INDEX GLOBAL USE HASH INDEX PAGES =200;
Command> INDEXES mytab1;

Indexes on table SAMPLEUSER.MYTAB1:
  PK: global unique hash index on columns:
    C
    B
  1 index found.

1 index found on 1 table.
Command> DROP TABLE mytab1;

表を作成します。表を変更することで主キー制約を追加します。USING INDEX (CreateIndexStmt)句を指定します。(CreateIndexStmt)句は、TimesTenのCREATE INDEX文です。この文の詳細は、「CREATE INDEX」を参照してください。

Command> CREATE TABLE mytab1 (c TT_INTEGER NOT NULL, b TT_INTEGER NOT NULL, 
           a TT_INTEGER NOT NULL) DISTRIBUTE BY HASH (a,b);
Command> ALTER TABLE mytab1 ADD CONSTRAINT pk PRIMARY KEY (c,b) 
           USING INDEX (CREATE GLOBAL UNIQUE HASH INDEX myglobalix ON mytab1 (c,b) PAGES =200);
Command> indexes mytab1;

Indexes on table SAMPLEUSER.MYTAB1:
  MYGLOBALIX: global unique hash index on columns:
    C
    B
  1 index found.

1 index found on 1 table.
Command> DROP TABLE mytab1;
この例では、USING INDEX GLOBAL|LOCAL句にはUSING INDEX (CreateIndexStmt)句を使用できないことを示しています。
Command> CREATE TABLE mytab1 (c TT_INTEGER NOT NULL, b TT_INTEGER NOT NULL, 
           a TT_INTEGER NOT NULL) DISTRIBUTE BY HASH (a,b);
Command> ALTER TABLE mytab1 ADD CONSTRAINT pk PRIMARY KEY (c,b) 
           USING INDEX GLOBAL USE HASH INDEX PAGES = 200 
           USING INDEX (CREATE GLOBAL UNIQUE HASH INDEX myglobalix ON mytab1 (c,b) PAGES =200);
 1001: Syntax error in SQL statement  before or at: "USING", character position: 102
...USING INDEX GLOBAL USE HASH INDEX PAGES = 200 USING INDEX (CREATE G...
                                                 ^^^^^
The command failed.

例: TimesTen Scaleoutのグローバル索引を使用した一意制約の追加

次に示す例は、ALTER TABLE ADD UNIQUE CONSTRAINTでグローバル索引を使用するための様々な構文の使用を示しています。

表を作成します。表を変更することで一意制約を追加します。表を削除します。表を再作成して、一意制約を追加し、USING INDEX GLOBAL句を指定します。

Command> CREATE TABLE mytab1 (c TT_INTEGER NOT NULL, b TT_INTEGER NOT NULL, 
           a TT_INTEGER NOT NULL) DISTRIBUTE BY HASH (a,b);
Command> ALTER TABLE mytab1 ADD UNIQUE (a);
Command> indexes mytab1;

Indexes on table SAMPLEUSER.MYTAB1:
  TTUNIQUE_6E6: unique range index on columns:
    A
  1 index found.

1 index found on 1 table.
Command> DROP TABLE mytab1;
Command> CREATE TABLE mytab1 (c TT_INTEGER NOT NULL, b TT_INTEGER NOT NULL, 
           a TT_INTEGER NOT NULL) DISTRIBUTE BY HASH (a,b);
Command> ALTER TABLE mytab1 ADD UNIQUE (a) USING INDEX GLOBAL;
Command> indexes mytab1;

Indexes on table SAMPLEUSER.MYTAB1:
  $GUA8C5B4ECE6D8: global unique range index on columns:
    A
  1 index found.

1 index found on 1 table.
Command> DROP TABLE mytab1;

表を作成します。一意制約を追加することで表を変更し、USING INDEX (CreateIndexStmt)句を使用してローカル一意索引を作成します。別の一意制約を追加することで表を再度変更します。USING INDEX (CreateIndexStmt)句を使用して、グローバル一意索引を作成します。

Command> CREATE TABLE mytab1 (c TT_INTEGER NOT NULL, b TT_INTEGER NOT NULL, 
           a TT_INTEGER NOT NULL) DISTRIBUTE BY HASH (a,b);
Command> ALTER TABLE mytab1 ADD UNIQUE (b) USING INDEX (CREATE UNIQUE INDEX myuniqueidxB ON mytab1 (b));
Command> indexes mytab1;

Indexes on table SAMPLEUSER.MYTAB1:
  MYUNIQUEIDXB: unique range index on columns:
    B
  1 index found.

1 index found on 1 table.
Command> ALTER TABLE mytab1 ADD UNIQUE (c) USING INDEX (CREATE GLOBAL UNIQUE INDEX myuniqueidxC ON mytab1 (c));
Command> indexes mytab1;

Indexes on table SAMPLEUSER.MYTAB1:
  MYUNIQUEIDXB: unique range index on columns:
    B
  MYUNIQUEIDXC: global unique range index on columns:
    C
  2 indexes found.

2 indexes found on 1 table.
Command> DROP TABLE mytab1;

ALTER TABLEのその他の例: TimesTen Scaleout

表6-6に、表の変更に関連付けられているルールを示します。サポートされている例を次に示します。

表6-6 ALTER TABLEルール

ALTER文 説明
ALTER TABLE t1 ADD CONSTRAINT c1
 PRIMARY KEY (p);

表に主キー制約が追加されます。分散キーは変更されません。

CREATE TABLE t1 (c1 NUMBER, 
 c2 VARCHAR2 (10));

ALTER TABLE t1 
 DISTRIBUTE BY HASH (c1);

表が空の場合、操作は成功します。表が空でない場合、空でない表では分散キーを変更できないため、操作は失敗します。

ALTER TABLE t1 ADD CONSTRAINT c1
 FOREIGN KEY (f1)REFERENCES t2 (c2);

操作が成功します。t1表の分散はc1制約に関連していません。

CREATE TABLE t1...CONSTRAINT fk1...
 DISTRIBUTE BY REFERENCE(fk1);

ALTER TABLE t1 DROP CONSTRAINT(fk1);

操作が失敗します。表を分散するために外部キーが使用されます。

次に示す例は、「表6-6」の表に示した情報をサポートします。

ALTER TABLEを使用した主キー制約の追加

この例では、主キーまたは分散句なしでmytable表を作成します。表は、ハッシュによって非表示列に分散されます。次に、ALTER TABLE文を使用して主キー制約が追加されます。操作は成功しますが、分散キーは変更されません。

Command> CREATE TABLE mytable (col1 NUMBER NOT NULL, col2 VARCHAR2 (32));
Command> describe mytable;
 
Table SAMPLEUSER.MYTABLE:
  Columns:
    COL1                            NUMBER NOT NULL
    COL2                            VARCHAR2 (32) INLINE
  DISTRIBUTE BY HASH
 
1 table found.
(primary key columns are indicated with *)

ここで、表を変更して主キーを追加します。操作が成功します。分散スキームおよび分散キーは変更されません。

Command> ALTER TABLE mytable ADD CONSTRAINT c1 PRIMARY KEY (col1);
Command> describe mytable;
 
Table SAMPLEUSER.MYTABLE:
  Columns:
   *COL1                            NUMBER NOT NULL
    COL2                            VARCHAR2 (32) INLINE
  DISTRIBUTE BY HASH
 
1 table found.
(primary key columns are indicated with *)

一意列に分散した表への主キー制約の追加

この例では、mytab表を作成し、ハッシュによってデータをid2一意列に分散します。この例では、次に、id列に主キー制約を追加して、mytab表を変更します。ttIsql describeコマンドは、表がハッシュによってid2列に分散されたままであることを示します。

Command> CREATE TABLE mytab (id TT_INTEGER NOT NULL, id2 TT_INTEGER UNIQUE, 
           id3 TT_INTEGER) distribute by hash (id2);
Command> ALTER TABLE mytab ADD CONSTRAINT c1 PRIMARY KEY (id);                  Command> describe mytab;
 
Table SAMPLEUSER.MYTAB:
  Columns:
   *ID                              TT_INTEGER NOT NULL
    ID2                             TT_INTEGER UNIQUE
    ID3                             TT_INTEGER
  DISTRIBUTE BY HASH (ID2)
 
1 table found.
(primary key columns are indicated with *)

ALTER TABLEを使用した分散キーの変更

この例では、表が空の場合にのみ、ALTER TABLE文を使用して分散キーを変更できることを示します。

Command> CREATE TABLE mytable2 (col1 NUMBER NOT NULL, col2 VARCHAR2 (32))
         DISTRIBUTE BY HASH (col1,col2);
Command> describe mytable2;
 
Table SAMPLEUSER.MYTABLE2:
  Columns:
    COL1                            NUMBER NOT NULL
    COL2                            VARCHAR2 (32) INLINE
  DISTRIBUTE BY HASH (COL1, COL2)
 
1 table found.
(primary key columns are indicated with *)

ALTER TABLE文を使用して、分散キーをcol1に変更します。表が空であるため、操作は成功します。

Command> ALTER TABLE mytable2 DISTRIBUTE BY HASH (col1);
Command> describe mytable2;
 
Table SAMPLEUSER.MYTABLE2:
  Columns:
    COL1                            NUMBER NOT NULL
    COL2                            VARCHAR2 (32) INLINE
  DISTRIBUTE BY HASH (COL1)
 
1 table found.
(primary key columns are indicated with *)

データの行を挿入し、分散キーを再度col1col2に変更することを試みます。表が空でないため、操作は失敗します。

Command> INSERT INTO mytable2 VALUES (10, 'test');
1 row inserted.
Command> commit;
Command> ALTER TABLE mytable2 DISTRIBUTE BY HASH (col1,col2);
 1069: Table not empty. Alter table distribution is only permitted on empty
tables.
The command failed.

分散キーの一部ではない外部キー制約の追加

この例では、まず、accounts表とaccounts2表を記述します。この例では、次に、accounts2表を変更して、外部キー制約を追加します。この制約はaccounts2表の分散に含まれていないため、操作は成功します。

Command> describe accounts;
 
Table SAMPLEUSER.ACCOUNTS:
  Columns:
   *ACCOUNT_ID                      NUMBER (10) NOT NULL
    PHONE                           VARCHAR2 (15) INLINE NOT NULL
    ACCOUNT_TYPE                    CHAR (1) NOT NULL
    STATUS                          NUMBER (2) NOT NULL
    CURRENT_BALANCE                 NUMBER (10,2) NOT NULL
    PREV_BALANCE                    NUMBER (10,2) NOT NULL
    DATE_CREATED                    DATE NOT NULL
    CUST_ID                         NUMBER (10) NOT NULL
  DISTRIBUTE BY REFERENCE (FK_CUSTOMER)
 
1 table found.
(primary key columns are indicated with *)

Command> describe accounts2;
 
Table SAMPLEUSER.ACCOUNTS2:
  Columns:
   *ACCOUNTS2_ID                    NUMBER (10) NOT NULL
    ACCOUNT_ORIG_ID                 NUMBER (10) NOT NULL
    STATUS                          NUMBER (2) NOT NULL
  DISTRIBUTE BY HASH (ACCOUNTS2_ID)
 
1 table found.
(primary key columns are indicated with *)

Command> ALTER TABLE accounts2 ADD CONSTRAINT accounts2_fk FOREIGN KEY 
           (account_orig_id) REFERENCES accounts (account_id);

ttIsql indexesコマンドを使用して、accounts2_fk制約が正常に作成されたことを示します。

Command> indexes accounts2;
 
Indexes on table SAMPLEUSER.ACCOUNTS2:
  ACCOUNTS2: unique range index on columns:
    ACCOUNTS2_ID
  ACCOUNTS2_FK: non-unique range index on columns:
    ACCOUNT_ORIG_ID
    (foreign key index references table SAMPLEUSER.ACCOUNTS(ACCOUNT_ID))
  2 indexes found.
 
2 indexes found on 1 table.

分散キーとして使用される外部キー制約の削除試行

この例では、fk_accounts制約の削除を試みます。制約が分散キーとして使用されているため、操作は失敗します。

Command> describe transactions;
 
Table SAMPLEUSER.TRANSACTIONS:
  Columns:
   *TRANSACTION_ID                  NUMBER (10) NOT NULL
   *ACCOUNT_ID                      NUMBER (10) NOT NULL
   *TRANSACTION_TS                  TIMESTAMP (6) NOT NULL
    DESCRIPTION                     VARCHAR2 (60) INLINE
    OPTYPE                          CHAR (1) NOT NULL
    AMOUNT                          NUMBER (6,2) NOT NULL
  DISTRIBUTE BY REFERENCE (FK_ACCOUNTS)
 
1 table found.
(primary key columns are indicated with *)

Command> ALTER TABLE transactions DROP CONSTRAINT fk_accounts;
 1072: Dropping a table's reference by distribution foreign key is not allowed.
The command failed.

ALTER TABLEのSQL構文: TimesTen Classic

1つの列の追加:

ALTER TABLE [Owner.]TableName ADD [COLUMN] ColumnName ColumnDataType
  [DEFAULT DefaultVal] [[NOT] INLINE] [UNIQUE] [NULL]
  [COMPRESS (CompressColumns [,...])];

複数の列の追加:

ALTER TABLE [Owner.]TableName ADD (ColumnName ColumnDataType 
  [DEFAULT DefaultVal] [[NOT] INLINE] [UNIQUE] [NULL] [,... ] )
  [COMPRESS (CompressColumns [,...])];

NOT NULL列の追加(注意: DEFAULT句が必要):

ALTER TABLE [Owner.]TableName
  ADD [COLUMN] ColumnName ColumnDataType
    NOT NULL [ENABLE] DEFAULT DefaultVal [[NOT] INLINE] [UNIQUE]
  [COMPRESS (CompressColumns [,...])]

複数のNOT NULL列の追加(注意: DEFAULT句が必要):

ALTER TABLE [Owner.]TableName
  ADD (ColumnName ColumnDataType
       NOT NULL [ENABLE] DEFAULT DefaultVal [[NOT] INLINE] [UNIQUE] [,...])
  [COMPRESS (CompressColumns [,...])]

CompressColumnsの構文は次のとおりです。

{ColumnDefinition | (ColumnDefinition [,...])} BY DICTIONARY 
   [MAXVALUES = CompressMax]

列の削除。

ALTER TABLE [Owner.]TableName 
  DROP {[COLUMN] ColumnName | (ColumnName [,... ] )}

ノート:

圧縮列グループの列を削除する場合は、圧縮列グループのすべての列を指定する必要があります。

範囲索引を使用した主キー制約の追加:

ALTER TABLE [Owner.]TableName ADD CONSTRAINT ConstraintName
  PRIMARY KEY (ColumnName [,... ])

ハッシュ索引を使用した主キー制約の追加:

ALTER TABLE [Owner.]TableName ADD CONSTRAINT ConstraintName
  PRIMARY KEY (ColumnName [,... ])
  USE HASH INDEX PAGES = RowPages | CURRENT

外部キーおよびON DELETE CASCADE(オプション)の追加:

ALTER TABLE [Owner.]TableName 
ADD [CONSTRAINT ForeignKeyName] FOREIGN KEY
    (ColumnName [,...]) REFERENCES RefTableName
       [(ColumnName [,...])] [ON DELETE CASCADE]

外部キーの削除:

ALTER TABLE [Owner.]TableName 
DROP CONSTRAINT ForeignKeyName

ノート:

ALTER TABLEを使用して主キー制約を削除することはできません。制約を削除するには、表を削除して再作成します。

ハッシュ索引のサイズ変更:

ALTER TABLE [Owner.]TableName
SET PAGES = RowPages | CURRENT

主キーで使用する索引をハッシュ索引に変更:

ALTER TABLE [Owner.]TableName
USE HASH INDEX PAGES = RowPages | CURRENT

主キーで使用する索引をUSE RANGE INDEX句で範囲索引に変更するには、次のように実行します。

ALTER TABLE [Owner.]TableName
USE RANGE INDEX

列のデフォルト値の変更:

ALTER TABLE [Owner.]TableName
MODIFY (ColumnName DEFAULT DefaultVal)

列の一意制約の追加または削除:

ALTER TABLE Owner.]TableName
{ADD | DROP} UNIQUE (ColumnName)

NULL値可能な列のデフォルト値をNULLに変更することによるデフォルト値の削除:

ALTER TABLE [Owner.]TableName
MODIFY (ColumnName DEFAULT NULL)

LRUエージングの追加:

ALTER TABLE [Owner.]TableName
ADD AGING LRU [ON | OFF]

時間ベースのエージングの追加:

ALTER TABLE [Owner.]TableName
ADD AGING USE ColumnName LIFETIME num1
    {SECOND[S] | MINUTE[S] | HOUR[S] | DAY[S]}
     [CYCLE num2 {SECOND[S] | MINUTE[S] | HOUR[S] | DAY[S] }]
    [ON | OFF]

エージング状態の変更:

ALTER TABLE [Owner.]TableName
SET AGING {ON | OFF}

エージングの削除:

ALTER TABLE [Owner.]TableName
DROP AGING

存続期間の変更(時間ベースのエージングの場合):

ALTER TABLE [Owner.]TableName
SET AGING LIFETIME num1 {SECOND[S] | MINUTE[S] | HOUR[S] | DAY[S]}

サイクルの変更(時間ベースのエージングの場合):

ALTER TABLE [Owner.]TableName
SET AGING CYCLE num2 {SECOND[S] | MINUTE[S] | HOUR[S] | DAY[S]}

ALTER TABLEのパラメータ: TimesTen Classic

パラメータ 説明

[Owner.] TableName

変更する表を指定します。

UNIQUE

ColumnNameの各行の値が一意である必要があることを示します。

MODIFY

指定した列の属性を新しい値に変更します。

DEFAULT [DefaultVal |NULL]

列がデフォルト値(DefaultVal)を持つことを指定します。NULLを指定すると、列のデフォルト値が削除されます。デフォルト値にSYSDATEを指定した列を追加すると、既存の行の列の値のみが、列が追加された時点のシステム日付になります。デフォルト値がUSER関数の1つである場合、列の値はALTER TABLE文を実行したセッションのユーザーの値になります。現在、ROWIDデータ型のデフォルト値を割り当てることはできません。

列のデフォルト値を変更しても、既存の行は変更されません。

ノート: レプリケーション・スキームの一部である表にNOT NULL列を追加するには、DDL_REPLICATON_LEVELが3以上である必要があります。

ColumnName

ALTER TABLE文に含める列の名前。新しい列に、既存の列または別の新しい列と同じ名前を指定することはできません。NOT NULL列を追加する場合は、DEFAULT句を含める必要があります。

ColumnDataType

追加する列のデータ型です。追加のパラメータが必要なデータ型もあります。指定できるデータ型の詳細は、「データ型」を参照してください。

NOT NULL [ENABLE]

列を追加する場合に、NOT NULLを指定できます。NOT NULLを指定する場合は、DEFAULT句を含める必要があります。任意で、NOT NULL句の後にENABLEを指定できます。NOT NULL制約は常に有効なため、ENABLEの指定は必須ではありません。

INLINE|NOT INLINE

デフォルトでは、宣言された列の長さが128バイトより大きい可変長の列は表外に保存されます。宣言された列の長さが128バイト以下の可変長の列は、表内に保存されます。INLINEおよびNOT INLINEキーワードを使用すると、表を作成するときのデフォルトの動作を無効にすることができます。

COMPRESS (CompressColumns [,...])

圧縮が有効な表について圧縮列グループを定義します。表の1つ以上の列を含めることができます。

圧縮グループで複数列を定義する場合は、列をINLINEとして指定する必要があります。アウトライン列は、複数列圧縮グループに指定できません。

各圧縮列グループは、最大16列に制限されます。

圧縮列の詳細は、「表の列ベースの圧縮(TimesTen Classic)」を参照してください。

BY DICTIONARY

各圧縮列グループの圧縮ディクショナリを定義します。

MAXVALUES = CompressMax

CompressMaxは、表の個別値の合計数であり、圧縮列グループ・ポインタ列のサイズを1、2または4バイトに設定し、ディクショナリ表のエントリの最大数のサイズを設定します。

ディクショナリ表の場合、NULLは1つの一意の値としてカウントされます。

CompressMaxは、1から232-1までの整数です。

MAXVALUES句を省略した場合の最大サイズのデフォルトは232-1であり、ポインタ列に4バイトが使用されます。値が232-1よりも大きい場合は、エラーがスローされます。

圧縮ディクショナリの最大サイズ指定の詳細は、「表の列ベースの圧縮(TimesTen Classic)」を参照してください。

ADD CONSTRAINT ConstraintName PRIMARY KEY (ColumnName

[,... ] ) [USE HASH INDEX PAGES = RowPages | CURRENT]

表に主キー制約を追加します。主キーの列はNOT NULLとして定義する必要があります。

主キー制約を適用するために使用する索引の名前としてConstraintNameを指定します。主キーに対して使用するNOT NULL列の名前としてColumnNameを指定します。

主キーに対してハッシュ索引を使用するには、USE HASH INDEX句を指定します。指定しない場合、主キー制約には範囲索引が使用されます。

CURRENTを指定すると、表内の現在の行数を使用してページ・カウント値が計算されます。RowPagesを指定する場合は、ページ数が使用されます。RowPagesの値は、表の想定行数を256で除算して決定します。たとえば、表に256,000行ある場合は、RowPagesに1000を指定します(256000/256=1000)。

RowPagesの値は、0を含まない正の定数である必要があります。

TimesTenでは、表に行がない場合は、PAGES=CURRENTを指定しないことをお薦めします。

推定した数が小さすぎると、パフォーマンスが悪化します。ハッシュ索引の詳細は、「列定義: TimesTen Classic」を参照してください。

ノート: ADD CONSTRAINTを使用して指定された主キー制約を追加する前に、ALTER TABLEを使用して主キー制約を削除できないことに注意してください。制約を削除するには、表を削除してから再作成する必要があります。

CONSTRAINT

外部キーを削除することを指定します。オプションで、追加された外部キーの名前をユーザーが指定するように指定します。

ForeignKeyName

追加または削除する外部キーの名前です。すべての外部キーは、ユーザーが名前を指定しなかった場合、デフォルトの名前が割り当てられます。ユーザーが指定した名前またはシステムの名前のいずれかをDROP FOREIGN KEY句で指定できます。

FOREIGN KEY

外部キーを追加することを指定します。

REFERENCES

外部キーが別の表を参照することを指定します。

RefTableName

外部キーが参照する表の名前です。

[ON DELETE CASCADE]

ON DELETE CASCADE参照アクションを有効にします。指定されている場合、参照先キーの値を含む行が親表から削除されると、依存する外部キーの値を持つ子表の行も削除されます。

USE HASH INDEX PAGES = RowPages | CURRENT

主キーで使用する索引をハッシュ索引に変更します。主キーですでにハッシュ索引を使用している場合、この句はSET PAGES句と同じです。

USE RANGE INDEX

主キーで使用する索引を範囲索引に変更します。主キーですでに範囲索引を使用している場合、この句は無視されます。

SET PAGES = RowPages | CURRENT

表の想定ページ数に基づいてハッシュ索引のサイズを変更します。CURRENTを指定すると、表内の現在の行数を使用してページ・カウント値が計算されます。RowPagesを指定する場合は、ページ数が使用されます。RowPagesの値は、表の想定行数を256で除算して決定します。たとえば、表に256,000行ある場合は、RowPagesに1000を指定します(256000/256=1000)。

RowPagesの値は、0を含まない正の定数である必要があります。

TimesTenでは、表に行がない場合は、PAGES=CURRENTを指定しないことをお薦めします。

推定した数が小さすぎると、パフォーマンスが悪化します。ハッシュ索引の詳細は、「列定義: TimesTen Classic」を参照してください。

ADD AGING LRU [ON | OFF]

エージング・ポリシーが定義されていない既存の表に、LRUエージングを追加します。

LRUエージング・ポリシーでは、エージングのタイプ(LRU)、エージング状態(ONまたはOFF)およびLRUエージング属性を定義します。

エージング状態をONまたはOFFのいずれかに設定します。ONはエージング状態が有効であり、エージングが自動的に実行されることを示します。OFFはエージング状態が無効であり、エージングが自動的に実行されないことを示します。両方の場合、エージング・ポリシーが定義されます。デフォルトはONです。

LRU属性は、組込みプロシージャのttAgingLRUConfigまたはttAgingTableLRUConfigのどちらか(あるいはその両方)をコールすることで定義します。LRU属性はSQLレベルでは定義できません。詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』「ttAgingLRUConfig」および「ttAgingTableLRUConfig」と、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』「表へのエージング・ポリシーの実装」を参照してください。

ADD AGING USE ColumnName...[ON| OFF]

エージング・ポリシーが定義されていない既存の表に、時間ベースのエージングを追加します。

時間ベースのエージング・ポリシーでは、エージングのタイプ(時間ベース)、エージング状態(ONまたはOFF)および時間ベースのエージング属性を定義します。

エージング状態をONまたはOFFのいずれかに設定します。ONはエージング状態が有効であり、エージングが自動的に実行されることを示します。OFFはエージング状態が無効であり、エージングが自動的に実行されないことを示します。両方の場合、エージング・ポリシーが定義されます。デフォルトはONです。

時間ベースのエージング属性はSQLレベルで定義され、LIFETIME句およびCYCLE句で指定します。

時間ベース・エージングに使用する列の名前としてColumnNameを指定します。列は、NOT NULLTIMESTAMPデータ型またはDATEデータ型として定義します。この列の値がSYSDATEから差し引かれ、指定した単位(分、時間、日数)を使用して切り捨てられた後、LIFETIME値との比較が行われます。結果がLIFETIME値より大きい場合、その行はエージングの候補となります。

エージングに使用される列の値は、アプリケーションによって更新されます。この列の値が不明な行がある場合、その行がエージ・アウトされないようにするには、列に大きなデフォルト値を定義します(この列はNULLにはできません)。

TT_TIMESTAMPデータ型またはTT_DATEデータ型を使用してエージング列を定義できます。TT_DATEデータ型を選択する場合は、LIFETIME単位としてDAYSを指定する必要があります。

時間ベースのエージングの詳細は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』「表へのエージング・ポリシーの実装」を参照してください。

LIFETIME Num1 {SECOND[S] | MINUTE[S] | HOUR[S] | DAY[S]

時間ベースのエージング・ポリシーを既存の表に追加する場合は、ADD AGING USE ColumnName句の後にLIFETIME句を指定します。LIFETIMEの設定を変更するには、SET AGING句の後にLIFETIME句を指定します。

LIFETIME句には、データがキャッシュに保持されることが保証される時間を指定します。

Num1には、行がキャッシュに保持される時間の長さを、秒、分、時間または日数で表す正の整定数を指定します。LIFETIME値を超えた行はエージ・アウト(表から削除)されます。エージング列をTT_DATEデータ型を使用して定義する場合は、LIFETIME単位としてDAYSを指定する必要があります。

時間の単位の概念がサポートされています。時間の単位にDAYSを指定した場合、タイムスタンプの日付が同じ日になっているすべての行が同時にエージ・アウトされます。また、HOURSを時間の単位に指定した場合は、タイムスタンプ値の時間が同じ行が、すべて同時にエージ・アウトされます。LIFETIMEの3 DAYSは、LIFETIMEの72 HOURS(3×24)やLIFETIMEの432 MINUTES(3×24×60)とは異なります。

CYCLE Num2 {SECOND[S]| MINUTE[S]| HOUR[S]|DAY[S]}

時間ベースのエージング・ポリシーを既存の表に追加する場合は、LIFETIME句の後にオプションでCYCLE句を指定します。

CYCLEは、時間ベースのエージング属性です。

CYCLE句は、データが指定したLIFETIME値を超えているかどうか、その結果エージ・アウト(削除)する必要があるかどうかを確認するために、システムで行をチェックする頻度を指定します。

Num2には、正の整数を指定します。

CYCLE句を指定しない場合、デフォルト値は5分です。Num2に0を指定した場合、エージング・スレッドは1秒ごとに起動します。

エージング状態がOFFの場合、エージングは自動的に実行されず、CYCLE句は無視されます。

CYCLE設定を変更するには、SET AGING句の後にCYCLE句を指定します。

SET AGING {ON|OFF}

エージング状態を変更します。エージング・ポリシーが事前に定義されている必要があります。ONにすると、自動エージングが有効になります。OFFにすると、自動エージングが無効になります。外部のスケジューラでエージングを制御するには、エージングを無効にしてttAgingScheduleNow組込みプロシージャを起動します。

DROP AGING

表からエージング・ポリシーを削除します。一度定義すると、変更することはできません。エージングを削除してから再定義してください。

SET AGING LIFETIME Num1 {SECOND[S]| MINUTE[S]|HOUR[S] |DAY[S]}

この句を使用して時間ベースのエージングの存続期間を変更します。

Num1には、正の整数を指定します。

エージング列をTT_DATEデータ型を使用して定義した場合は、LIFETIME単位としてDAYSを指定する必要があります。

SET AGING CYCLE Num2 {SECOND[S]| MINUTE[S]| HOUR[S]|DAY[S]}

この句を使用して時間ベースのエージングのサイクルを変更します。

Num2には、正の整数を指定します。

ALTER TABLEの説明: TimesTen Classic

  • ALTER TABLE文を使用して一時表を変更することはできません。

  • ALTER TABLE ADD [COLUMN] ColumnName文は、既存の表に1つ以上の新しい列を追加します。1つ以上の列を追加した場合、新しい列は、新しい1つのパーティション内の表のすべての既存の行の最後に追加されます。

  • ALTER TABLE ADDまたはDROP COLUMN文を使用して、レプリケートされた表に対して列を追加または削除できます。

    ALTER TABLEを使用して、TWOSAFE BY REQUESTトランザクションの一部であるレプリケートされた表を変更しないでください。

  • マテリアライズド・ビューから参照されている列は削除できません。

  • 列の追加、列の削除、およびキャッシュ・グループ表の制約の追加にALTER TABLE文は使用できません。

  • 追加される列の数に関係なく、1文につき1つのパーティションのみが表に追加されます。

  • 表にALTERを実行して、デフォルト値を持つNOT NULL列を追加します。DEFAULT句は必須です。次の制限があります:

    • この列を主キー列として使用することはできません。具体的には、ALTER TABLE ADD ConstraintName PRIMARY KEY (ColumnName [,...])文では、その列を指定できないということです。

    • この列を時間ベースのエージングに使用することはできません。具体的には、文ALTER TABLE ADD AGING USE ColumnNameに、この列を指定することはできません。

      ノート:

      レプリケーション・スキームの一部である表にNOT NULL列を追加するには、DDL_REPLICATON_LEVELが3以上である必要があります。
  • 新しい列に対してデフォルト値が指定されている場合を除き、追加されるすべての列の初期値はNULLです。

  • 表の列の合計数は1000以下です。また、表のパーティションの合計数は1000以下であり、そのうちの1つはTimesTenによって使用されます。

  • 主キー制約を通常の表またはディテール表やマテリアライズド・ビュー表に追加するには、ADD CONSTRAINT ... PRIMARY KEY句を使用します。すでに主キーを持つ表に対しては、この句を使用しないでください。

  • ADD CONSTRAINT... PRIMARY KEY句を使用して主キー制約を追加する際に、USE HASH INDEX句を指定しないと、主キー制約に対して範囲索引が使用されます。

  • 表がレプリケートされる際に、レプリケーション・エージェントがアクティブである場合は、ADD CONSTRAINT ... PRIMARY KEY句を使用できません。最初にレプリケーション・エージェントを停止します。

  • グローバル一時表でADD CONSTRAINT ... PRIMARY KEY句を指定しないでください。

  • 主キーを指定して定義されているキャッシュ・グループ表はCREATE CACHE GROUP文で定義する必要があるため、キャッシュ・グループ表ではADD CONSTRAINT ... PRIMARY KEY句を指定しないでください。

  • ALTER TABLE ADD文の結果として、問合せ時に新しい各パーティションに対して追加の読取りが発生します。このため、変更された表のパフォーマンスがわずかに悪化することがあります。パフォーマンスを回復するには、表を削除して再作成するか、またはttMigrate create -c -relaxedUpgradeコマンドを使用してから、ttRestore -r -relaxedUpgradeコマンドを使用して表をリストアします。追加された列を削除しても、悪化したパフォーマンスは回復されず、パーティションの数も減りません。

  • ALTER TABLE DROP文を使用して既存の表から1つ以上の列を削除すると、削除された列は、表の現在のすべての行から削除されます。それ以降のSQL文では、削除した列は使用できなくなります。表の主キーに含まれている列は削除できません。また、表の外部キーに含まれている列も、すべての外部キーを削除しないかぎり削除できません。索引付けされた列は、列の索引をすべて削除しないかぎり削除できません。ALTER TABLEを使用して表の列をすべて削除することはできません。かわりにDROP TABLEを使用します。

  • 表から列が削除された場合、その表を参照するすべてのコマンドを再コンパイルする必要があります。削除された列が参照されると、再コンパイル時にエラーが発生することがあります。アプリケーションはそのコマンドを再度準備し、パラメータと結果列を再作成する必要があります。列が表に追加された場合、SELECT *文を含むコマンドは無効になります。これらのコマンドのみを再度準備する必要があります。その他のすべてのコマンドは、想定したとおりに動作します。

  • 列を削除しても、列の領域は解放されません。

  • UNIQUE制約を追加すると、(領域の増加および処理時間の増加という点で)オーバーヘッドが発生します。これは、UNIQUE制約を維持するための索引が作成されるためです。UNIQUE制約を維持するために使用している索引を、DROP INDEX文を使用して削除することはできません。

  • UNIQUE制約とそれに関連付けられている索引は、レプリケートされた表の一意索引として使用されている場合、削除できません。

  • アプリケーションで表の主キーに対して範囲問合せを実行する場合は、ALTER TABLE...USE RANGE INDEXを使用します。

  • アプリケーションで表の主キーに対して完全一致検索を実行する場合は、ALTER TABLE...USE HASH INDEXを使用します。

  • 表に主キーがない場合、USE HASH INDEX句またはUSE RANGE INDEX句を指定すると、エラーが生成されます。

  • レプリケートされた表で外部キーの追加や削除を行う前に、レプリケーション・エージェントを停止してください。

  • 子表の外部キー制約でON DELETE CASCADEを指定している場合、ユーザーは、子表のDELETE権限を明示的に必要とせずに、DELETE権限を持つ親表から行を削除できます。

  • ON DELETE CASCADEトリガー・アクションを変更するには、外部キー制約を削除して再定義してください。

  • ON DELETE CASCADEは、マテリアライズド・ビューのディテール表でサポートされています。子表に対して定義されたマテリアライズド・ビューがある場合、親表からの削除によって子表でカスケード削除が行われます。つまり、親表での削除により、マテリアライズド・ビューも変更されます。

  • DELETE文によって報告される行の総数には、ON DELETE CASCADEアクションの結果、子表から削除された行は含まれません。

  • ON DELETE CASCADE: 親表から子表へのパスが異なる場合があるため、次のルールが適用されます。

  • 親表から子表へのすべてのパスを、deleteパスかdo not deleteパスのいずれかに統一します。

    • deleteパスのすべての子表でON DELETE CASCADEを指定します。

    • このルールは、1つの親表から複数の子表へ、または複数の親表から1つの子表へのパスには適用されません。

  • ON DELETE CASCADE: 第2のルールも適用されます。

  • ある表にdeleteパスでアクセスする場合、その表のすべての子表にもdeleteパスでアクセスします。

  • レプリケーションを含むON DELETE CASCADE: 次の制限が適用されます。

    • ON DELETE CASCADEで指定された外部キーは、レプリケートされた表のマスターとサブスクライバの間で一致している必要があります。これは実行時に確認されます。エラーが発生すると、RECEIVERスレッドは処理を停止します。

    • カスケード削除のツリーに含まれる表をレプリケートする場合は、ツリーに含まれるすべての表をレプリケートする必要があります。この制限は、レプリケーション・スキームを作成したとき、またはレプリケーション表のいずれかにON DELETE CASCADE付きの外部キーを追加したときにチェックされます。エラーが検出されると、処理は中断します。外部キー制約を変更する前に、まずレプリケーション・スキームを削除することが必要になる場合があります。

  • ALTER TABLE ADD/DROP CONSTRAINT文には、次の制限があります。

    • 外部キーが削除されると、TimesTenでは外部キーに関連付けられている索引も削除されます。通常のDROP INDEX文を使用して外部キーに関連付けられている索引を削除しようとすると、エラーになります。

    • 外部キーは、キャッシュ・グループの表では追加または削除できません。

    • 外部キーは、ビューまたは一時表では追加または削除できません。

    • ALTER TABLEを使用して主キー制約を削除することはできません。制約を削除するには、表を削除してから再作成する必要があります。

  • 表のエージング・ポリシーを定義した後に、エージング・ポリシーをLRUから時間ベースに、または時間ベースからLRUに変更できません。最初にエージングを削除し、表を変更して新しいエージング・ポリシーを追加する必要があります。

  • エージング・ポリシーは、エージング状態を変更するように定義する必要があります。

  • LRUエージングでは、行がアクセスされているかまたは参照されているかどうかを、次のルールで判断します。

    • SELECT文の結果セットを構築するために使用された行。

    • INSERT ... SELECT文の結果セットを構築するために使用された行。

    • 更新または削除対象の行。

  • コマンドで参照される表に対してLRUエージングの削除や追加を行うと、コンパイルされたコマンドは無効と指定され、再コンパイルが必要になります。

  • エージング状態がONOFFかにかかわらずエージング処理をすぐにスケジュールするには、ttAgingScheduleNowプロシージャをコールします。

  • 時間ベースのエージング・ポリシーの場合、エージング列を追加または変更できません。これは、NOT NULL列を追加または変更できないためです。

  • エージングの制限:

    • 時間ベースのエージングに使用されている列は削除できません。

    • 外部キーによって関連付けられている表には、同じエージング・ポリシーを設定する必要があります。

    • LRUエージングでは、子行がエージングの対象でない場合、この子行とその親行は削除されません。ON DELETE CASCADEの設定は無視されます。

    • 時間ベースのエージングでは、親行がエージングの対象である場合、すべての子行が削除されます。ON DELETE CASCADEは、設定の有無にかかわらず無視されます。

  • 表の列ベースの圧縮の制限:

    • 表の作成時に表の圧縮が有効化された場合は、ALTER TABLE文でのみ圧縮列グループを追加できます。非圧縮列は、圧縮が有効な表を含め、任意の表に追加できます。表への圧縮列グループの追加の詳細は、「表の列ベースの圧縮(TimesTen Classic)」を参照してください。

    • 圧縮列グループの列は変更できません。

    • ALTER TABLEコマンドを使用して圧縮列グループ内のすべての列を削除でき、圧縮列グループ内の列を削除するときは、圧縮列グループ内のすべての列を削除に対して指定する必要があります。

    • 既存の非圧縮列を変更して圧縮するためにALTER TABLEは使用できません。次に例を示します:

      Command> create table mytab (a varchar2 (30), b int, c int) compress ((a,b)
                 by dictionary);
      Command> alter table mytab add (d int) compress (c by dictionary);
      2246: Cannot change compression clause for already defined column C 
      The command failed.

TimesTenでALTER TABLEを使用する場合のパーティションの理解

表を作成すると、初期パーティションが作成されます。表にALTERを実行して列を追加すると、セカンダリ・パーティションが作成されます。各ALTER TABLE文に対して、1つのセカンダリ・パーティションが作成されます。セカンダリ・パーティション内の列については、その列に主キー制約を作成したり、その列を時間ベースのエージングに使用することはできません。

ttMigrate -r -relaxedUpgradeを使用すると、複数のパーティションをまとめることができます。これは、初期パーティションと1つ以上のセカンダリ・パーティションが、初期パーティションと呼ばれる単一のパーティションにまとめられることを意味します。複数のパーティションをまとめると、表にALTERを実行して列に主キー制約を追加したり、その列を時間ベースのエージングに使用することができます。これは、列がセカンダリ・パーティションにはなく、現在は初期パーティションに存在するためです。

データベースがレプリケーションに関係し、複数のパーティションをまとめる必要がある場合は、(CREATE REPLICATION文の) StoreAttribute TABLE DEFINITION CHECKING RELAXEDを使用する必要があります。マスターとサブスクライバの両方で、あるいはマスターまたはサブスクライバで-duplicateを使用して、ttMigrate -r -relaxedUpgradeを実行します。

ttSchemaを使用して、列のパーティション番号を表示します。ttSchemaによって、セカンダリ・パーティション番号1はパーティション1として、セカンダリ・パーティション番号2はパーティション2として、以降同様に表示されます。

例として、2つの列を持つ表MyTabを作成します。この表にALTERを使用して、Col3Col4の2つの列を、NOT NULL DEFAULT句を指定して追加します。

Command> CREATE TABLE MyTab (Col1 NUMBER, Col2 VARCHAR2 (30));
Command> ALTER TABLE MyTab ADD (Col3 NUMBER NOT NULL DEFAULT 10, Col4 TIMESTAMP
            NOT NULL DEFAULT TIMESTAMP '2012-09-03 12:00:00');

ttSchemaを使用して、Col3およびCol4がセカンダリ・パーティション1に含まれていることを確認します。

ttschema -DSN sampledb_1122
-- Database is in Oracle type mode
create table TESTUSER.MYTAB (
        COL1 NUMBER,
        COL2 VARCHAR2(30 BYTE) INLINE,
        COL3 NUMBER NOT NULL DEFAULT 10,
        COL4 TIMESTAMP(6) NOT NULL DEFAULT TIMESTAMP '2012-09-03 12:00:00');
-- column COL3 partition 1
-- column COL4 partition 1

Col3に主キー制約を、Col4に時間ベースのエージングを追加してみます。初期パーティションに含まれていない列には、主キー制約も、時間ベースのエージングも追加できないため、エラーが表示されます。

Command> ALTER TABLE MyTab ADD CONSTRAINT PriKey PRIMARY KEY (Col3);
 2419: All columns in a primary key constraint must be in the initial partition;
column COL3 was added by ALTER TABLE
The command failed.

Command> ALTER TABLE MyTab ADD AGING USE Col4 LIFETIME 3 DAYS;
 3023: Aging column must be in the initial partition; column COL4 was added by
ALTER TABLE
The command failed.

ttMigrateを、-relaxedUpgradeオプションとともに使用して、パーティションをまとめます。その後ttSchemaを使用して、パーティションがまとめられて、セカンダリ・パーティション1には列がないことを確認します。

ttMigrate -c dsn=sampledb_1122 test.migrate
 
Saving user PUBLIC
User successfully saved.
 
Saving table TESTUSER.MYTAB
  Saving rows...
  0/0 rows saved.
Table successfully saved.

ttDestroy sampledb_1122

ttMigrate -r -relaxedUpgrade
 dsn=sampledb_1122 test.migrate
 
Restoring table TESTUSER.MYTAB
  Restoring rows...
  0/0 rows restored.
Table successfully restored.

ttSchema DSN=sampledb_1122
-- Database is in Oracle type mode
create table TESTUSER.MYTAB (
        COL1 NUMBER,
        COL2 VARCHAR2(30 BYTE) INLINE,
        COL3 NUMBER NOT NULL DEFAULT 10,
        COL4 TIMESTAMP(6) NOT NULL DEFAULT TIMESTAMP '2012-09-03 12:00:00');

この段階で、Col3に主キー制約を追加し、Col4に時間ベースのエージングを追加します。ttMigrateの結果としてCol3およびCol4は初期パーティションに含まれているため、成功します。ttSchemaを使用して結果を確認します。

Command> ALTER TABLE MyTab ADD CONSTRAINT PriKey PRIMARY KEY (Col3);
Command> ALTER TABLE MyTab ADD AGING USE Col4 LIFETIME 3 DAYS;

ttschema sampledb_1122
-- Database is in Oracle type mode
create table TESTUSER.MYTAB (
        COL1 NUMBER,
        COL2 VARCHAR2(30 BYTE) INLINE,
        COL3 NUMBER NOT NULL DEFAULT 10,
        COL4 TIMESTAMP(6) NOT NULL DEFAULT TIMESTAMP '2012-09-03 12:00:00')
    AGING USE COL4 LIFETIME 3 days CYCLE 5 minutes ON;
 
    alter table TESTUSER.MYTAB add constraint PRIKEY primary key (COL3);

ALTER TABLEの例: TimesTen Classic

returnrate列をparts表に追加します。

ALTER TABLE parts ADD COLUMN returnrate DOUBLE;

numsssign列とprevdept列をcontractor表に追加します。

ALTER TABLE contractor
  ADD ( numassign INTEGER, prevdept CHAR(30) );

employee表のaddr1列とaddr2列を削除します。

ALTER TABLE employee DROP ( addr1, addr2 );

booksUNIQUEのtitle列を削除します。

ALTER TABLE books DROP UNIQUE (title);

デフォルト値5を使用してx1列をt1表に追加します。

ALTER TABLE t1 ADD (x1 INT DEFAULT 5);

列のデフォルト値x1を2に変更します。

ALTER TABLE t1 MODIFY (x1 DEFAULT 2);

主キー制約c1を追加するようにprimarykeytest表を変更します。ttIsql INDEXESコマンドを使用して、主キー制約c1が作成され、範囲索引が使用されていることを表示します。

Command> CREATE TABLE primarykeytest (col1 TT_INTEGER NOT NULL);
Command> ALTER TABLE primarykeytest ADD CONSTRAINT c1 
         PRIMARY KEY (col1);
Command> INDEXES primarykeytest;

Indexes on table SAMPLEUSER.PRIMARYKEYTEST:
  C1: unique range index on columns:
    COL1
  1 index found.

1 index found on 1 table.

ハッシュ索引を使用して主キー制約c2を追加するようにprikeyhash表を変更します。ttIsql INDEXESコマンドを使用して、主キー制約c2が作成され、ハッシュ索引が使用されていることを表示します。

Command> CREATE TABLE prikeyhash (col1 NUMBER (3,2) NOT NULL);
Command> ALTER TABLE prikeyhash ADD CONSTRAINT c2
           PRIMARY KEY (col1) USE HASH INDEX PAGES = 20;
Command> INDEXES prikeyhash;

Indexes on table SAMPLEUSER.PRIKEYHASH:
  C2: unique hash index on columns:
    COL1
  1 index found.

1 table found.

すでに主キーを使用して定義されている表に主キー制約を追加してみます。次のエラーが表示されます。

Command> CREATE TABLE oneprikey (col1 VARCHAR2 (30) NOT NULL, 
         col2 TT_BIGINT NOT NULL, col3 CHAR (15) NOT NULL, 
         PRIMARY KEY (col1,col2));
Command> ALTER TABLE oneprikey ADD CONSTRAINT c2 
         PRIMARY KEY (col1,col2);
 2235: Table can have only one primary key
The command failed.

NOT NULLとして定義されていない列に主キー制約を追加してみます。次のエラーが表示されます。

Command> CREATE TABLE prikeynull (col1 CHAR (30));
Command> ALTER TABLE prikeynull ADD CONSTRAINT c3 
         PRIMARY KEY (col1);
 2236: Nullable column cannot be part of a primary key
The command failed.

この例では、範囲索引およびハッシュ索引の使用方法を示しています。col1を主キーとしてpkey表を作成します。デフォルトで範囲索引が作成されます。次に、col1の索引をハッシュ索引に変更するよう、この表をALTER文で変更します。再度、索引を範囲索引に戻すよう、この表をALTER文で変更します。

Command> CREATE TABLE pkey (col1 TT_INTEGER PRIMARY KEY, col2 VARCHAR2 (20));
Command> INDEXES pkey;
Indexes on table SAMPLEUSER.PKEY:
   PKEY: unique range index on columns:
    COL1
 1 index found.
1 index found on 1 table.

ハッシュ索引を使用するようにpkey表を変更します。

Command> ALTER TABLE pkey USE HASH INDEX PAGES = CURRENT;
Command> INDEXES pkey;
Indexes on table SAMPLEUSER.PKEY:
  PKEY: unique hash index on columns:
    COL1
  1 index found.
1 table found.

USE RANGE INDEX句で、範囲索引を使用するようにpkey表を変更します。

Command> ALTER TABLE pkey USE RANGE INDEX;
Command> INDEXES pkey;
Indexes on table SAMPLEUSER.PKEY:
  PKEY: unique range index on columns:
    COL1
  1 index found.
1 table found.

この例では、主キーを使用しないで列に範囲索引またはハッシュ索引を定義するように表を変更しようとしたときに、エラーが生成されます。

Command> CREATE TABLE myindex (Ccl1 CHAR (20));
Command> ALTER TABLE myindex USE RANGE INDEX;
 2810: The table has no primary key so cannot change its index type
The command failed.
Command> ALTER TABLE myindex USE HASH INDEX PAGES = CURRENT;
 2810: The table has no primary key so cannot change its index type
The command failed.

これらの例では、エージングにおいて、時間の単位がどのように機能するかを示しています。この例では、存続期間は3 Daysです。

  • (SYSDATE - ColumnValue) <= 3の場合、行はエージ・アウトされません。

  • (SYSDATE - ColumnValue) > 3の場合、行はエージ・アウトの対象となります。

  • (SYSDATE - ColumnValue) = 3 Days, 22 Hoursの場合、存続期間がDaysで指定されているため、行はエージ・アウトされません。存続期間が72 Hoursと指定されていた場合は、行はエージ・アウトされます。

この例では、LRUエージングを追加して表を変更します。表には事前に設定されたエージング・ポリシーはありません。エージング状態は、デフォルトでONになっています。

ALTER TABLE agingdemo3 ADD AGING LRU;
Command> DESCRIBE agingdemo3;
Table USER.AGINGDEMO3:
  Columns:
   *AGINGID                         NUMBER NOT NULL
    NAME                            VARCHAR2 (20) INLINE
  Aging lru on
1 table found.
(primary key columns are indicated with *)

この例では、時間ベースのエージングを追加して表を変更します。表には事前に設定されたエージング・ポリシーはありません。agingcolumn列はエージングに使用します。LIFETIMEは2日です。CYCLEは30分です。

ALTER TABLE agingdemo4
       ADD AGING USE agingcolumn LIFETIME 2 DAYS CYCLE 30 MINUTES;
Command> DESCRIBE agingdemo4;
Table USER.AGINGDEMO4:
  Columns:
   *AGINGID                         NUMBER NOT NULL
    NAME                            VARCHAR2 (20) INLINE
    AGINGCOLUMN                     TIMESTAMP (6) NOT NULL
  Aging use AGINGCOLUMN lifetime 2 days cycle 30 minutes on

この例では、エージング・ポリシーを一度作成すると、変更できないことを示しています。エージングを削除して、再定義する必要があります。

CREATE TABLE agingdemo5
       (agingid NUMBER NOT NULL PRIMARY KEY
       ,name VARCHAR2 (20)
       ,agingcolumn TIMESTAMP NOT NULL
       )
       AGING USE agingcolumn LIFETIME 3 DAYS OFF;
ALTER TABLE agingdemo5
      ADD AGING LRU;
 2980: Cannot add aging policy to a table with an existing aging policy. Have to
 drop the old aging first
The command failed.

表のエージングを削除し、LRUエージングを使用して再定義します。

ALTER TABLE agingdemo5
      DROP AGING;
ALTER TABLE agingdemo5
       ADD AGING LRU;
Command> DESCRIBE agingdemo5;
Table USER.AGINGDEMO5:
  Columns:
   *AGINGID                         NUMBER NOT NULL
    NAME                            VARCHAR2 (20) INLINE
    AGINGCOLUMN                     TIMESTAMP (6) NOT NULL
  Aging lru on
1 table found.
(primary key columns are indicated with *)

この例では、ALTER文で表のエージング状態をOFFに設定します。表には時間ベースのエージング・ポリシーが定義されています。エージング状態をOFFに設定すると、エージングは自動的には行われません。これは、外部のスケジューラを使用してエージング処理を制御する必要がある場合に有効です。エージング状態をOFFに設定し、ttAgingScheduleNowプロシージャをコールしてエージング処理を開始します。

Command> DESCRIBE agingdemo4;
Table USER.AGINGDEMO4:
  Columns:
   *AGINGID                         NUMBER NOT NULL
    NAME                            VARCHAR2 (20) INLINE
    AGINGCOLUMN                     TIMESTAMP (6) NOT NULL
  Aging use AGINGCOLUMN lifetime 2 days cycle 30 minutes on

ALTER TABLE AgingDemo4
       SET AGING OFF;

DESCRIBE agingdemo4を実行すると、エージング・ポリシーが定義されてエージング状態がOFFに設定されることに注意してください。

Command> DESCRIBE agingdemo4;
Table USER.AGINGDEMO4:
  Columns:
   *AGINGID                         NUMBER NOT NULL
    NAME                            VARCHAR2 (20) INLINE
    AGINGCOLUMN                     TIMESTAMP (6) NOT NULL
  Aging use AGINGCOLUMN lifetime 2 days cycle 30 minutes off
1 table found.
(primary key columns are indicated with *)

ttAgingScheduleNowをコールして、外部スケジューラでエージングを起動します。

Command> CALL ttAgingScheduleNow ('agingdemo4');

表にエージング列を追加し、その列を時間ベースのエージングに使用するように変更してみます。エラーが生成されます。

Command> DESCRIBE x;
Table USER1.X:
  Columns:
   *ID                              TT_INTEGER NOT NULL
1 table found.
(primary key columns are indicated with *)
Command> ALTER TABLE x ADD COLUMN t TIMESTAMP;
Command> ALTER TABLE x ADD AGING USE t LIFETIME 2 DAYS;
 2993: Aging column cannot be nullable
The command failed.

時間ベースのエージングを使用して定義された表のLIFETIME句を変更してみます。エージング列はTT_DATEデータ型を使用して定義されています。LIFETIME単位がDAYSで表されていないため、エラーが生成されます。

Command> CREATE TABLE aging1 (col1 TT_DATE NOT NULL) AGING USE 
         col1 LIFETIME 2 DAYS;
Command> ALTER TABLE aging1 SET AGING LIFETIME 2 HOURS;
 2977: Only DAY lifetime unit is allowed with a TT_DATE column
The command failed.

employees表を変更して、州のフルネームを含む新しい圧縮列stateを追加します。employees表には、job_idおよびmanager_idで構成された圧縮列グループがすでにあることに注意してください。

Command> ALTER TABLE employees 
         ADD COLUMN state VARCHAR2(20) 
         COMPRESS (state BY DICTIONARY);

Command> DESCRIBE employees; 
Table MYSCHEMA.EMPLOYEES:
  Columns:
   *EMPLOYEE_ID                     NUMBER (6) NOT NULL
    FIRST_NAME                      VARCHAR2 (20) INLINE
    LAST_NAME                       VARCHAR2 (25) INLINE NOT NULL
    EMAIL                           VARCHAR2 (25) INLINE NOT NULL
    PHONE_NUMBER                    VARCHAR2 (20) INLINE
    HIRE_DATE                       DATE NOT NULL
    JOB_ID                          VARCHAR2 (10) INLINE NOT NULL
    SALARY                          NUMBER (8,2)
    COMMISSION_PCT                  NUMBER (2,2)
    MANAGER_ID                      NUMBER (6)
    DEPARTMENT_ID                   NUMBER (4)
    STATE                           VARCHAR2 (20) INLINE
  COMPRESS ( ( JOB_ID, MANAGER_ID ) BY DICTIONARY,
             STATE BY DICTIONARY )
 
1 table found.
(primary key columns are indicated with *)

次の例では、圧縮列stateemployees表から削除します。

Command> ALTER TABLE employees
 DROP state;
Command> DESCRIBE employees; 
Table MYSCHEMA.EMPLOYEES:
  Columns:
   *EMPLOYEE_ID                     NUMBER (6) NOT NULL
    FIRST_NAME                      VARCHAR2 (20) INLINE
    LAST_NAME                       VARCHAR2 (25) INLINE NOT NULL
    EMAIL                           VARCHAR2 (25) INLINE NOT NULL
    PHONE_NUMBER                    VARCHAR2 (20) INLINE
    HIRE_DATE                       DATE NOT NULL
    JOB_ID                          VARCHAR2 (10) INLINE NOT NULL
    SALARY                          NUMBER (8,2)
    COMMISSION_PCT                  NUMBER (2,2)
    MANAGER_ID                      NUMBER (6)
    DEPARTMENT_ID                   NUMBER (4)
 COMPRESS ( ( JOB_ID, MANAGER_ID ) BY DICTIONARY )
 
1 table found.
(primary key columns are indicated with *)

関連項目