ヘッダーをスキップ
Oracle TimesTen In-Memory Database SQLリファレンス・ガイド
リリース11.2.1
B56051-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

ALTER TABLE

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

必要な権限

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

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

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

SQL構文

列の追加:

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

または

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

列の削除:

ALTER TABLE [Owner.]TableName
  DROP [COLUMN] ColumnName

または

ALTER TABLE [Owner.]TableName
  DROP (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 [Owner.]TableName
SET PAGES = {RowPages | CURRENT}

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

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

主キーで使用する索引を範囲索引に変更:

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
    {MINUTE[S] | HOUR[S] | DAY[S]}
     [CYCLE num2 {MINUTE[S] | HOUR[S] | DAY[S] }]
    [ON | OFF]

エージング状態の変更:

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

エージングの削除:

ALTER TABLE [Owner.]TableName
DROP AGING

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

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

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

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

パラメータ

ALTER TABLE文には、次のパラメータがあります。

パラメータ 説明
[Owner.] TableName 変更する表を指定します。
UNIQUE ColumnNameの各行の値が一意である必要があることを示します。
MODIFY 指定した列の属性を新しい値に変更します。
DEFAULT [DefaultVal |NULL] 列のデフォルト値(DefaultVal)を指定します。NULLを指定すると、列のデフォルト値が削除されます。デフォルト値にSYSDATEを指定した列を追加すると、既存の行の列の値のみが、列が追加された時点のシステム日付になります。デフォルト値がUSER関数の1つである場合、列の値はALTER TABLE文を実行したセッションのユーザーの値になります。

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

ColumnName UNIQUE CONSTRAINTまたはデフォルト値が変更される列の名前です。新しい列に、既存の列または別の新しい列と同じ名前を指定することはできません。
ColumnDataType 追加する列のデータ型です。追加のパラメータが必要なデータ型もあります。指定できるデータ型の詳細は、第1章「データ型」を参照してください。
INLINE|NOT INLINE デフォルトでは、宣言された列の長さが128バイトより大きい可変長の列は表外に保存されます。宣言された列の長さが128バイト以下の可変長の列は、表内に保存されます。INLINEおよびNOT INLINEキーワードを使用すると、表を作成するときのデフォルトの動作を無効にすることができます。
ADD CONSTRAINT ConstraintName PRIMARY KEY (ColumnName

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

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

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

主キーに対してハッシュ索引を使用するには、USE HASH INDEX句を指定します。 ページ・カウント値を計算するために、RowPages(正の定数)またはCURRENTを指定します。CURRENTを指定すると、表内の現在の行数を使用してページ・カウント値が計算されます。

ハッシュ索引とページの詳細は、「列定義」を参照してください。

CONSTRAINT 外部キーを削除することを指定します。オプションで、追加された外部キーの名前をユーザーが指定するように指定します。
ForeignKeyName 追加または削除する外部キーの名前です。すべての外部キーは、ユーザーが名前を指定しなかった場合、デフォルトの名前が割り当てられます。ユーザーが指定した名前またはシステムの名前のいずれかをDROP FOREIGN KEY句で指定できます。
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 表の行ページに想定される数に基づいてハッシュ索引のサイズを変更します。各行ページのデータの行数は、最大256です。この数によって、ハッシュ索引に対して作成されるハッシュ・バケットの数が決まります。最小値は1です。推定した数が小さすぎると、パフォーマンスが悪化します。 定数(RowPages)または現在の行ページの数を指定できます。ハッシュ索引とページの詳細は、「列定義」を参照してください。
RowPages 想定される行ページの数です。
CURRENT 現在使用されている行ページの数を使用します。
ADD AGING LRU [ON | OFF] エージング・ポリシーが定義されていない既存の表に、LRUエージングを追加します。

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

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

LRU属性はプロシージャttAgingLruConfigをコールして定義します。LRU属性はSQLレベルでは定義できません。

LRUエージングについては、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』の表のエージングの実装に関する説明を参照してください。

ADD AGING USE ColumnName...[ON| OFF] エージング・ポリシーが定義されていない既存の表に、時間ベースのエージングを追加します。

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

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

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

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

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

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

時間ベースのエージングについては、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』の表のエージングの実装に関する説明を参照してください。

LIFETIME Num1 {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 {MINUTE[S] | HOUR[S] |DAY[S] } 時間ベースのエージング・ポリシーを既存の表に追加する場合は、LIFETIME句の後にオプションでCYCLE句を指定します。

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

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

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

CYCLE句を指定しない場合、デフォルト値は5分です。Num2に0を指定すると、エージングは継続され、エージング・スレッドがスリープ状態になることはありません。

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

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

SET AGING {ON|OFF} エージング状態を変更します。エージング・ポリシーが事前に定義されている必要があります。ONにすると、自動エージングが有効になります。OFFにすると、自動エージングが無効になります。 外部のスケジューラでエージングを制御する場合は、エージングを無効にしてttAgingScheduleNow組込みプロシージャを起動します。
DROP AGING 表からエージング・ポリシーを削除します。一度定義すると、変更することはできません。エージングを削除してから再定義してください。
SET AGING LIFETIME Num1 {MINUTE[S] | HOUR[S] |

DAY[S] }

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

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

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

SET AGING CYCLE Num2 {MINUTE[S] | HOUR[S] |DAY[S]} この句を使用して時間ベースのエージングのCYCLEを変更します。

Num2は、正の整数である必要があります。


説明

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 );

booksのUNIQUEの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 table found.

ハッシュ索引を使用して主キー制約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 can not 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 table found.

ハッシュ索引を使用するように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.

範囲索引を使用するように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 illegalindex (Ccl1 CHAR (20));
Command> ALTER TABLE illegalindex USE RANGE INDEX;
 2810: The table has no primary key so cannot change its index type
The command failed.
Command> ALTER TABLE illegalindex USE HASH INDEX PAGES = CURRENT;
 2810: The table has no primary key so cannot change its index type
The command failed.

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

この例では、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.

関連項目


「CREATE TABLE」
「DROP TABLE」

『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』の表のエージングの実装に関する説明