ALTER TABLE文

ALTER TABLE文の使用によってスキーマが進化するときのNoSQL Databaseの動作は、主に、大規模なデータセット(レコード数が数百億から数千億)用に設計されています。簡単に述べると、ビッグ・データは、大規模で複雑なデータセットであり、特に、新しいデータ・ソースから取得されます。これらのデータセットは非常に大きく、従来のデータ処理ソフトウェアでは管理できません。しかし、このような大量のデータは、これまで対応できなかったビジネス上の問題に対処するために使用されます。したがって、ALTER TABLE文を使用して表スキーマを変更したときには、NoSQL Databaseによって表内のすべてのレコードが変更されそれらがディスクに書き戻されるわけではありません。そうではなく、デフォルト値の概念が採用されており、その値は、前のバージョンのスキーマで書き込まれたデータがリーダーで読み取られたときに挿入されます。

ただし、アイデンティティ列の場合は、レコードの書込み以外に値を生成する方法がないため、ユーザーが表を変更しアイデンティティ列を追加したときには、その表より前に書き込まれたレコードのその列が読み取られると、そのアイデンティティ列の値がnullになります。

alter tableコマンドを使用すると、次の操作を実行できます。
  • 表スキーマへのスキーマ・フィールドの追加
  • 表スキーマからのスキーマ・フィールドの削除
  • 表スキーマのスキーマ・フィールドの変更
  • リージョンの追加
  • リージョンの削除
  • アイデンティティ定義の変更
  • アイデンティティの削除
  • 表の存続時間値の変更

1つのコマンドで指定できる操作のタイプは1つだけです。たとえば、スキーマ・フィールドの削除とTTL値の設定を一緒に行うことはできません。

ノート:

JSONコレクション表では、ALTER TABLE文を使用して変更できるのは、表のデフォルトのTTL値のみです。その他のスキーマ変更はサポートされておらず、エラー・メッセージが返されます。

構文

alter_table_statement ::= 
   ALTER TABLE name_path (alter_field_statements | ttl_definition)

alter_field_statements ::= 
   "(" alter_field_statement ("," alter_field_statement)* ")"

alter_field_statement ::= 
   add_field_statement | drop_field_statement | modify_field_statement | alter_regions_statement

add_field_statement ::= 
   ADD schema_path type_definition 
   [default_definition | identity_definition | uuid_definition | mr_counter_definition]
   [comment]

drop_field_statement ::= DROP schema_path

modify_field_statement ::= 
   (MODIFY schema_path identity_definition) | 
   (DROP IDENTITY)

alter_regions_statement ::= add_regions_statement | drop_regions_statement

add_regions_statement ::= ADD REGIONS region_names

drop_regions_statement ::= DROP REGIONS region_names

region_names ::= region_name ["," region_name]*

schema_path ::= init_schema_path_step ("." schema_path_step)*
init_schema_path_step ::= id ("[" "]")*
    schema_path_step ::= id ("[" "]")* | VALUES "(" ")"

セマンティクス

modify_field_statement

MODIFYキーワードを使用して、アイデンティティ列のみを変更できます。

add_field_statement
フィールドを追加しても、表内の既存の行には影響しません。フィールドを追加すると、そのデフォルト値またはNULLが、このフィールドを含まない既存の行で、このフィールドの値として使用されます。追加するフィールドは、最上位フィールド(つまり、表の列)にすることも、階層表スキーマ内で深くネストすることもできます。その結果、フィールドはパスを介して指定されます。パス構文は、問合せで使用されるもののサブセットであり、パス式の項で説明します。

ノート:

mr_counter_definitionパラメータは、列の型をMR_COUNTERデータ型として宣言します。このデータ型は、複数リージョン表でのみ使用できます。
drop_field_statement

フィールドを削除しても、表内の既存の行には影響しません。フィールドが削除されると、そのフィールドを含む既存の行内で非表示になります。削除するフィールドは、最上位フィールド(つまり、表の列)にすることも、階層表スキーマ内で深くネストすることもできます。その結果、フィールドはパスを介して指定されます。パス構文は、問合せで使用されるもののサブセットであり、パス式の項で説明します。

add_regions_statement
リージョンの追加句を使用すると、マルチリージョンのOracle NoSQL Database環境で既存のMR表を新しいリージョンとリンクできます。この句は、MR表を新しいリージョンに拡張するときに使用されます。管理者ガイドユースケース2: マルチリージョン表の拡張を参照してください。

ノート:

この句はMR子表では機能しません。かわりに、親表を変更して新しいリージョンを追加します。これにより、階層内のすべての子表にそのリージョンが自動的に追加されます。
drop_regions_statement

リージョンの削除句を使用すると、マルチリージョンのOracle NoSQL Database環境で参加リージョンから既存のMR表を切断できます。この句は、MR表をより少ないリージョンに縮小するときに使用されます。管理者ガイドユースケース3: 複数リージョン表の縮小を参照してください。

例に従って使用する場合は、例で使用する表の説明に従って表を作成し、データを挿入します。

例5-20 表スキーマへのフィールドの追加

ALTER TABLE stream_acct(ADD acct_balance INTEGER DEFAULT 0)

説明: この例では、デフォルト値が0の新しいフィールドacct_balanceをTVストリーミング・アプリケーションに追加します。表から行をいつでも取得すると、新しいフィールドが行に追加されます。ディスク上の形式が更新され、行が表に書き込まれたときに新しいフィールドが追加されます。ALTER TABLE文にデフォルト値を指定すると、行が取得されたとき、または行が書き込まれ、アプリケーションが新しいフィールドに値を指定していないときに、値が新しいフィールドに移入されます。デフォルト値を指定しない場合、かわりにNULL値が移入されます。フィールドは、最上位レベル・フィールド(表の列)として追加することも、階層レコード内で深くネストすることもできます。この場合、フィールドはパスを介して指定されます。

例5-21 users表のotherNamesフィールドへのmiddle名の追加。

ALTER TABLE users (ADD otherNames[].middle STRING)

説明: otherNamesフィールドはレコードの配列であり、配列内の各レコードにはfirstおよびlast名前フィールドが含まれます。この例では、ALTER文を使用して、otherNames配列内にネストされているレコードにmiddle名前フィールドを追加します。middle名前フィールドを、配列内に存在する固定スキーマ・レコードのデータ型に追加します。したがって、ALTER TABLE文でフィールドへのパスを指定する必要があります。

例5-22 表スキーマでのスキーマ・フィールドの削除

ALTER TABLE stream_acct(DROP acct_balance)

説明: この例では、TVストリーミング・アプリケーション・スキーマからacct_balanceフィールドを削除します。スキーマ内の主キー以外の任意のフィールドを削除できます。

主キー・フィールドを削除しようとすると、次に示すエラーが表示されます。

ALTER TABLE stream_acct(DROP acct_id)

出力(エラーの表示):

Error handling command ALTER TABLE stream_acct(DROP acct_id): Error: at (1, 27) Cannot remove a primary key field: acct_id

例5-23 リージョンの追加

add regions句を使用すると、マルチリージョンのOracle NoSQL Database環境で既存の複数リージョン表(MR表)を新しいリージョンとリンクできます。この句を使用して、MR表を新しいリージョンに展開します。新しいリージョンの作成の詳細は、リモート・リージョンの作成を参照してください。

次のDDLコマンドを使用して、新しいリージョンを既存のMR表に関連付けます。

ALTER TABLE <table_name> ADD REGIONS <region_name>

説明: ここで、table_nameはMR表で、region_nameは既存のリージョンです。詳細は、CREATE REGION文を参照してください。

例5-24 リージョンの削除

リージョンの削除句を使用すると、マルチリージョンのOracle NoSQL Database環境で参加リージョンから既存のMR表を切断できます。この句を使用すると、MR表を縮小してリージョンを減らすことができます。

複数リージョンのOracle NoSQL Database設定で特定のリージョンからMR表を削除するには、参加している他のすべてのリージョンから次のステップを実行する必要があります。

ALTER TABLE <table_name> DROP REGIONS <comma_separated_list_of_regions>

説明: ここで、table_nameはMR表、comma_separated_list_of_regionsは削除されるリージョンのリストです。

例5-25 表の存続時間値の変更

存続時間(TTL)のメカニズムを使用すると、表の行に時間枠を設定して、それを経過すると、行が自動的に期限切れになって使用できなくなるようにできます。デフォルトでは、作成するすべての表のTTL値は、有効期限がないことを示すゼロとなります。

ALTER TABLE文を使用すると、任意の表のTTL値を変更できます。TTLを数値で指定し、その後にHOURSまたはDAYSを指定できます。

ALTER TABLE stream_acct USING TTL 15 DAYS

説明: 前述の文では、TVストリーミング・アプリケーション表に追加される新しい行に15日の有効期限を追加します。

ノート:

表のTTL値を変更しても、表の既存の行のTTL値は変更されません。かわりに、表の変更後に作成された行のデフォルトのTTL値のみを変更します。表内のすべてのレコードのTTLを変更するには、表の各レコードを反復処理してそのTTL値を更新する必要があります。