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: TimesTen Scaleoutでの使用方法
この文は、TimesTen Scaleoutでサポートされています。列ベースの圧縮およびエージングはサポートされていません。
次を参照してください。
ALTER TABLE: TimesTen Classicでの使用方法
次を参照してください。
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}句の一部であり、オプションです。指定することで、主キーに一意のハッシュ索引を作成することを示します。指定しないと、一意の範囲索引が作成されます。グローバル索引とローカル索引の両方に使用できます。
TimesTenでは、表に行がない場合は、 |
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
| パラメータ | 説明 |
|---|---|
|
|
変更する表を指定します。 |
|
|
構文の詳細は、「CREATE TABLE」を参照してください。 |
|
|
列 |
|
|
指定した列の属性を新しい値に変更します。 |
|
|
列がデフォルト値( 列のデフォルト値を変更しても、既存の行は変更されません。 ノート: レプリケーション・スキームの一部である表に |
|
|
|
|
|
追加する列のデータ型です。追加のパラメータが必要なデータ型もあります。指定できるデータ型の詳細は、「データ型」を参照してください。 |
|
|
列を追加する場合に、 |
|
|
デフォルトでは、宣言された列の長さが128バイトより大きい可変長の列は表外に保存されます。宣言された列の長さが128バイト以下の可変長の列は、表内に保存されます。 |
|
|
外部キーを削除することを指定します。オプションで、追加された外部キーの名前をユーザーが指定するように指定します。 |
DROP UNIQUE (ColumnName) |
一意制約が削除されることを示します。ColumnNameは、制約の名前です。
|
|
|
追加または削除する外部キーの名前です。すべての外部キーは、ユーザーが名前を指定しなかった場合、デフォルトの名前が割り当てられます。ユーザーが指定した名前またはシステムの名前のいずれかを |
|
|
外部キーを追加することを指定します。 |
|
|
外部キーが別の表を参照することを指定します。 |
|
|
外部キーが参照する表の名前です。 |
|
|
|
|
|
主キーで使用する索引をハッシュ索引に変更します。主キーですでにハッシュ索引を使用している場合、この句は |
|
|
主キーで使用する索引を範囲索引に変更します。主キーですでに範囲索引を使用している場合、この句は無視されます。 |
|
|
表の想定ページ数に基づいてハッシュ索引のサイズを変更します。
TimesTenでは、表に行がない場合は、 推定した数が小さすぎると、パフォーマンスが悪化します。ハッシュ索引の詳細は、「列定義: TimesTen Scaleout」を参照してください。 |
ALTER TABLE ADD PRIMARY KEYの説明: TimesTen Scaleout
ALTER TABLEの定義には、PRIMARY KEY句の後に追加の句を指定するオプションがあります。この句を使用すると、主キー制約に対するグローバル索引またはローカル索引を指定できます。
-
USINGINDEX {GLOBAL | LOCAL}句は、主キー制約に対するグローバル索引またはローカル索引を指定できるようにする1つのオプションです。GLOBALまたはLOCALのキーワードを指定する必要があります。ハッシュ索引を定義する場合は、USINGINDEX {GLOBAL | LOCAL}句の後にオプションでUSEHASHINDEX句を指定できます。 USING INDEX (CreateIndexStmt)句は、グローバル索引またはローカル索引を指定する別のオプションです。(CreateIndexStmt)句は、TimesTenのCREATEINDEX文に従って索引を定義することを示します。カッコ( )が必要です。主キー制約の要件に応じて、一意索引を作成する必要があります。CREATEINDEX文の詳細は、「CREATE INDEX」を参照してください。
ノート:
ALTER TABLEの定義では、USING INDEX {GLOBAL | LOCAL}とUSING INDEX (CreateIndexStmt)の両方を使用することはできません。どちらかの句を指定するか、どちらの句も指定しないでください。
グローバル索引とローカル索引およびそれらのTimesTen Scaleoutでの使用の詳細は、「CREATE INDEX」を参照してください。
ALTER TABLE ADD UNIQUEの説明: TimesTen Scaleout
ALTER TABLEの定義には、UNIQUE句の後に追加の句を指定するオプションがあります。この句を使用すると、一意制約に対するグローバル索引またはローカル索引を指定できます。
-
USINGINDEX {GLOBAL | LOCAL}句は、主キー制約に対するグローバル索引またはローカル索引を指定できるようにする1つのオプションです。GLOBALまたはLOCALのキーワードを指定する必要があります。 USING INDEX (CreateIndexStmt)句は、グローバル索引またはローカル索引を指定する別のオプションです。(CreateIndexStmt)句は、TimesTenのCREATEINDEX文に従って索引を定義することを示します。カッコ( )が必要です。一意制約の要件に応じて、一意索引を作成する必要があります。CREATEINDEX文の詳細は、「CREATE INDEX」を参照してください。
ノート:
ALTER TABLEの定義では、USING INDEX {GLOBAL | LOCAL}とUSING INDEX (CreateIndexStmt)の両方を使用することはできません。どちらかの句を指定するか、どちらの句も指定しないでください。
グローバル索引とローカル索引およびそれらのTimesTen Scaleoutでの使用の詳細は、「CREATE INDEX」を参照してください。
ALTER TABLEの追加情報: TimesTen Scaleout
-
表を変更してデフォルトを変更したり、列と制約を追加および削除できます。ただし、表が空でない場合は、分散スキームを変更できません。また、
DISTRIBUTEBYREFERENCE句で指定された制約は削除できません。分散スキームの詳細は、「CREATE TABLE」を参照してください。詳細は、『Oracle TimesTen In-Memory Database Scaleoutユーザーズ・ガイド』の「表の変更」を参照してください。 -
ALTER TABLE文を使用して一時表を変更することはできません。 -
ALTER TABLE ADD [COLUMN]ColumnName文は、既存の表に1つ以上の新しい列を追加します。1つ以上の列を追加した場合、新しい列は、新しい1つのパーティション内の表のすべての既存の行の最後に追加されます。 -
マテリアライズド・ビューから参照されている列は削除できません。
-
列の追加、列の削除、およびキャッシュ・グループ表の制約の追加に
ALTERTABLE文は使用できません。 -
追加される列の数に関係なく、1文につき1つのパーティションのみが表に追加されます。
-
表に
ALTERを実行して、デフォルト値を持つNOTNULL列を追加します。DEFAULT句は必須です。この列を主キー列として使用することはできません。具体的には、
ALTERTABLEADDConstraintNamePRIMARYKEY(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 GLOBALをUSE 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); |
操作が成功します。 |
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 *)
データの行を挿入し、分散キーを再度col1、col2に変更することを試みます。表が空でないため、操作は失敗します。
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
| パラメータ | 説明 |
|---|---|
|
|
変更する表を指定します。 |
|
|
列 |
|
|
指定した列の属性を新しい値に変更します。 |
|
|
列がデフォルト値( 列のデフォルト値を変更しても、既存の行は変更されません。 ノート: レプリケーション・スキームの一部である表に |
|
|
|
|
|
追加する列のデータ型です。追加のパラメータが必要なデータ型もあります。指定できるデータ型の詳細は、「データ型」を参照してください。 |
|
|
列を追加する場合に、 |
|
|
デフォルトでは、宣言された列の長さが128バイトより大きい可変長の列は表外に保存されます。宣言された列の長さが128バイト以下の可変長の列は、表内に保存されます。 |
|
|
圧縮が有効な表について圧縮列グループを定義します。表の1つ以上の列を含めることができます。 圧縮グループで複数列を定義する場合は、列を 各圧縮列グループは、最大16列に制限されます。 圧縮列の詳細は、「表の列ベースの圧縮(TimesTen Classic)」を参照してください。 |
|
|
各圧縮列グループの圧縮ディクショナリを定義します。 |
|
|
ディクショナリ表の場合、
MAXVALUES句を省略した場合の最大サイズのデフォルトは2 圧縮ディクショナリの最大サイズ指定の詳細は、「表の列ベースの圧縮(TimesTen Classic)」を参照してください。 |
|
|
表に主キー制約を追加します。主キーの列は 主キー制約を適用するために使用する索引の名前として 主キーに対してハッシュ索引を使用するには、
TimesTenでは、表に行がない場合は、 推定した数が小さすぎると、パフォーマンスが悪化します。ハッシュ索引の詳細は、「列定義: TimesTen Classic」を参照してください。 ノート: |
|
|
外部キーを削除することを指定します。オプションで、追加された外部キーの名前をユーザーが指定するように指定します。 |
|
|
追加または削除する外部キーの名前です。すべての外部キーは、ユーザーが名前を指定しなかった場合、デフォルトの名前が割り当てられます。ユーザーが指定した名前またはシステムの名前のいずれかを |
|
|
外部キーを追加することを指定します。 |
|
|
外部キーが別の表を参照することを指定します。 |
|
|
外部キーが参照する表の名前です。 |
|
|
|
|
|
主キーで使用する索引をハッシュ索引に変更します。主キーですでにハッシュ索引を使用している場合、この句は |
|
|
主キーで使用する索引を範囲索引に変更します。主キーですでに範囲索引を使用している場合、この句は無視されます。 |
|
|
表の想定ページ数に基づいてハッシュ索引のサイズを変更します。
TimesTenでは、表に行がない場合は、 推定した数が小さすぎると、パフォーマンスが悪化します。ハッシュ索引の詳細は、「列定義: TimesTen Classic」を参照してください。 |
|
|
エージング・ポリシーが定義されていない既存の表に、LRUエージングを追加します。 LRUエージング・ポリシーでは、エージングのタイプ(LRU)、エージング状態( エージング状態を LRU属性は、組込みプロシージャの |
|
|
エージング・ポリシーが定義されていない既存の表に、時間ベースのエージングを追加します。 時間ベースのエージング・ポリシーでは、エージングのタイプ(時間ベース)、エージング状態( エージング状態を 時間ベースのエージング属性はSQLレベルで定義され、 時間ベース・エージングに使用する列の名前として エージングに使用される列の値は、アプリケーションによって更新されます。この列の値が不明な行がある場合、その行がエージ・アウトされないようにするには、列に大きなデフォルト値を定義します(この列は
時間ベースのエージングの詳細は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』の「表へのエージング・ポリシーの実装」を参照してください。 |
|
|
時間ベースのエージング・ポリシーを既存の表に追加する場合は、
時間の単位の概念がサポートされています。時間の単位に |
|
|
時間ベースのエージング・ポリシーを既存の表に追加する場合は、
エージング状態が
|
|
|
エージング状態を変更します。エージング・ポリシーが事前に定義されている必要があります。 |
|
|
表からエージング・ポリシーを削除します。一度定義すると、変更することはできません。エージングを削除してから再定義してください。 |
|
|
この句を使用して時間ベースのエージングの存続期間を変更します。
エージング列を |
|
|
この句を使用して時間ベースのエージングのサイクルを変更します。
|
ALTER TABLEの説明: TimesTen Classic
-
ALTER TABLE文を使用して一時表を変更することはできません。 -
ALTER TABLE ADD [COLUMN]ColumnName文は、既存の表に1つ以上の新しい列を追加します。1つ以上の列を追加した場合、新しい列は、新しい1つのパーティション内の表のすべての既存の行の最後に追加されます。 -
ALTER TABLEADDまたはDROP COLUMN文を使用して、レプリケートされた表に対して列を追加または削除できます。ALTERTABLEを使用して、TWOSAFE BY REQUESTトランザクションの一部であるレプリケートされた表を変更しないでください。 -
マテリアライズド・ビューから参照されている列は削除できません。
-
列の追加、列の削除、およびキャッシュ・グループ表の制約の追加に
ALTERTABLE文は使用できません。 -
追加される列の数に関係なく、1文につき1つのパーティションのみが表に追加されます。
-
表に
ALTERを実行して、デフォルト値を持つNOTNULL列を追加します。DEFAULT句は必須です。次の制限があります:-
この列を主キー列として使用することはできません。具体的には、
ALTERTABLEADDConstraintNamePRIMARYKEY(ColumnName[,...])文では、その列を指定できないということです。 -
この列を時間ベースのエージングに使用することはできません。具体的には、文
ALTER TABLE ADD AGING USEColumnNameに、この列を指定することはできません。ノート:
レプリケーション・スキームの一部である表に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エージングの削除や追加を行うと、コンパイルされたコマンドは無効と指定され、再コンパイルが必要になります。
-
エージング状態が
ONかOFFかにかかわらずエージング処理をすぐにスケジュールするには、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を使用して、Col3とCol4の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 );
表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 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 *)
次の例では、圧縮列stateをemployees表から削除します。
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 *)関連項目