テーブルの定義を変更したり、従属ビューを無効にしたりします。
ALTER TABLE [owner.]table-name { alter-clause, ... }
alter-clause : ADD create-clause | ALTER column-name column-alteration | ALTER [ CONSTRAINT constraint-name ] CHECK ( condition ) | DROP drop-object | RENAME rename-object | table-alteration
create-clause : column-name [ AS ] column-data-type [ new-column-attribute ... ] | table-constraint | PCTFREE integer
column-alteration : { column-data-type | alterable-column-attribute } [ alterable-column-attribute ... ] | SET COMPUTE ( compute-expression ) | ADD [ constraint-name ] CHECK ( condition ) | DROP { DEFAULT | COMPUTE | CHECK | CONSTRAINT constraint-name }
drop-object : column-name | CHECK | CONSTRAINT constraint-name | UNIQUE [ CLUSTERED ] ( index-columns-list ) | FOREIGN KEY fkey-name | PRIMARY KEY
rename-object : new-table-name | column-name TO new-column-name | CONSTRAINT constraint-name TO new-constraint-name
table-alteration : PCTFREE DEFAULT | [ NOT ] ENCRYPTED
new-column-attribute : [ NOT ] NULL | DEFAULT default-value | COMPRESSED | INLINE { inline-length | USE DEFAULT } | PREFIX { prefix-length | USE DEFAULT } | [ NO ] INDEX | IDENTITY | COMPUTE ( expression ) | column-constraint
table-constraint : [ CONSTRAINT constraint-name ] { CHECK ( condition ) | UNIQUE [ CLUSTERED | NONCLUSTERED ] ( column-name [ ASC | DESC ], ... ) | PRIMARY KEY [ CLUSTERED | NONCLUSTERED ] ( column-name [ ASC | DESC ], ... ) | foreign-key }
column-constraint : [ CONSTRAINT constraint-name ] { CHECK ( condition ) | UNIQUE [ CLUSTERED | NONCLUSTERED ] [ ASC | DESC ] | PRIMARY KEY [ CLUSTERED | NONCLUSTERED ] [ ASC | DESC ] | REFERENCES table-name [ ( column-name ) ] [ MATCH [ UNIQUE ] { SIMPLE | FULL } ] [ actions ][ CLUSTERED | NONCLUSTERED ] | NOT NULL }
alterable-column-attribute : [ NOT ] NULL | DEFAULT default-value | [ CONSTRAINT constraint-name ] CHECK { NULL | ( condition ) } | [ NOT ] COMPRESSED | INLINE { inline-length | USE DEFAULT } | PREFIX { prefix-length | USE DEFAULT } | [ NO ] INDEX
default-value : special-value | string | global variable | [ - ] number | ( constant-expression ) | ( sequence-expression ) | built-in-function( constant-expression ) | AUTOINCREMENT | GLOBAL AUTOINCREMENT [ ( partition-size ) ]
special-value : CURRENT DATABASE | CURRENT DATE | CURRENT TIME | [ CURRENT ] TIMESTAMP | CURRENT PUBLISHER | CURRENT REMOTE USER | [ CURRENT ] USER | [ CURRENT ] UTC TIMESTAMP | LAST USER | NULL
foreign-key : [ NOT NULL ] FOREIGN KEY [ role-name ] [ ( column-name [ ASC | DESC ], ... ) REFERENCES table-name [ ( pkey-column-list ) ] [ MATCH [ UNIQUE] { SIMPLE | FULL } ] [ actions ] [ CHECK ON COMMIT ] [ CLUSTERED ] [ FOR OLAP WORKLOAD ]
actions : [ ON UPDATE action ] [ ON DELETE action ]
action : CASCADE | SET NULL | SET DEFAULT | RESTRICT
ALTER TABLE [owner.]table-name { DISABLE VIEW DEPENDENCIES }
追加の句 次の項では、カラムやテーブルの制約をテーブルに追加するときに使用する句について説明します。
ADD column-name [ AS ] column-data-type [ new-column-attribute ...] 句 この句は、テーブルに新しいカラムを追加し、カラムのデータ型と属性を指定するときに使用します。
NULL 句と NOT NULL 句 この句は、カラムに NULL を許容するかどうかを指定するときに使用します。デフォルトでは、新しいカラムに NULL 値を使用できます。BIT 型のカラムの作成時には、NOT NULL 制約が自動的に設定されますが、NULL 入力可として宣言することもできます。
DEFAULT 句 DEFAULT 値を指定する場合、カラムの値を指定しない INSERT 文のカラムの値としてこのデフォルト値が使用されます。INSERT 文はカラムの値を指定しません。DEFAULT 値を指定しない場合、これは DEFAULT NULL と同じです。
DEFAULT に指定できる値を次に示します。
[ CURRENT ] TIMESTAMP テーブル内の各ローが最後に変更された日付を示すことができます。カラムの宣言に DEFAULT TIMESTAMP が指定されている場合は、ローを挿入するとタイムスタンプのデフォルト値が割り付けられます。この値は、ローが更新されるたびに現在の日付と時刻に基づいて更新されます。
挿入されたローにタイムスタンプのデフォルト値を割り付け、そのローが更新されてもタイムスタンプを更新しない場合は、DEFAULT TIMESTAMP の代わりに DEFAULT CURRENT TIMESTAMP を使用します。
DEFAULT TIMESTAMP で宣言されたカラムにはユニークな値が入ります。これにより、アプリケーションは、ほぼ同時に行われた同じローの更新を検出できます。現在の TIMESTAMP 値が直前の値と同じ場合は、default_timestamp_increment オプションの値が加えられます。
default_timestamp_increment オプションに基づいて、SQL Anywhere の TIMESTAMP 値を自動的にトランケートできます。これは、記録されるタイムスタンプ値の精度が低い他のデータベースソフトウェアとの互換性を維持する場合に便利です。
グローバル変数 @@dbts は、DEFAULT TIMESTAMP を使用するカラムの最後に生成された値を表す TIMESTAMP 値を返します。
[ CURRENT ] UTC TIMESTAMP テーブル内の各ローが最後に変更された日付を示すことができます。カラムの宣言に DEFAULT UTC TIMESTAMP が指定されている場合は、ローを挿入するとタイムスタンプのデフォルト値が割り付けられます。この値は、ローが更新されるたびに現在の協定世界時 (UTC: Coordinated Universal Time) に基づいて更新されます。
挿入されたローにタイムスタンプのデフォルト値を割り付け、そのローが更新されてもタイムスタンプを更新しない場合は、DEFAULT UTC TIMESTAMP の代わりに DEFAULT CURRENT UTC TIMESTAMP を使用します。
このデフォルトの動作は TIMESTAMP や CURRENT TIMESTAMP と同じですが、日付と時刻が協定世界時 (UTC: Coordinated Universal Time) になる点が異なります。
string 文字列を参照してください。
global-variable グローバル変数を参照してください。
constant-expression DEFAULT 句では、データベースオブジェクトを参照していない定数式を使用できます。その結果、GETDATE や DATEADD などの関数を使用できます。式が関数または単純な値でない場合、カッコで囲みます。
sequence-expression データベース内のシーケンスの現在の値または次の値に、DEFAULT を設定できます。
AUTOINCREMENT AUTOINCREMENT を使用する場合、カラムは整数データ型の 1 つ、または真数値型にします。
テーブルに挿入する場合、AUTOINCREMENT カラムの値を指定しないと、カラム内の任意の値より大きいユニーク値が生成されます。INSERT によって、カラムの現在の最大値よりも大きなカラム値を指定すると、その値は挿入され、以降の挿入時に開始ポイントとして使用されます。
ローを削除しても AUTOINCREMENT カウンターは減りません。ローの削除によって作成されたギャップは、挿入を行うときに明示的に割り当てることによってのみ埋めることができます。最大値未満のカラム値を明示的に挿入した後、明示的に割り当てられていない次のローを、以前の最大値より 1 大きい値を使ってオートインクリメントさせます。
カラムに直前に挿入された値は、グローバル変数 @@identity を調べることによって確認できます。
AUTOINCREMENT 値は、SYSTABCOL システムビューの max_identity カラムのデータ型に応じて、符号付き 64ビット整数として保持されます。生成された次の値が、AUTOINCREMENT が割り当てられたカラムに格納できる最大値を超えた場合は、NULL が返されます。NULL を入力できないように宣言されたカラムであると (プライマリキーのカラムである場合など)、SQL エラーが生成されます。
カラムに使用する次の値は、sa_reset_identity プロシージャーを使用してリセットできます。
GLOBAL AUTOINCREMENT このデフォルトは、Mobile Link 同期環境または SQL Remote レプリケーションにおいて複数のデータベースを使用するときのために用意されたものです。
このオプションは AUTOINCREMENT と同じですが、ドメインはパーティションに分割されます。各分割には同じ数の値が含まれます。データベースの各コピーにユニークなグローバルデータベース ID 番号を割り当てます。SQL Anywhere では、データベースのデフォルト値は、そのデータベース番号でユニークに識別された分割からのみ設定されます。
AUTOINCREMENT キーワードの直後にカッコで分割サイズを指定できます。この分割サイズには任意の正の整数を設定できますが、通常、分割サイズは、サイズの値がすべての分割で不足しないように選択されます。
カラムの型が BIGINT または UNSIGNED BIGINT である場合、デフォルトの分割サイズは 232 = 4294967296 です。それ以外の型のカラムの場合、デフォルトの分割サイズは 216 = 65536 です。特に、カラムの型が INT または BIGINT ではない場合は、これらのデフォルト値が適切ではないことがあるため、分割サイズを明示的に指定するのが最も賢明です。
このデフォルトを使用する場合、各データベース内のパブリックオプション global_database_id は、ユニークな正の整数に設定します。この値は、データベースをユニークに識別し、デフォルト値の割り当て元の分割を示します。使用できる値の範囲は np + 1 ~ p(n+ 1) です。ここで、n はパブリックオプション global_database_id の値を表し、p は分割サイズを表します。たとえば、分割サイズを 1000、global_database_id を 3 に設定すると、範囲は 3001 ~4000 になります。
前の値が p(n + 1) 未満であれば、このカラム内でこれまで使用した最大値より 1 大きい値が次のデフォルト値になります。カラムに値が含まれていない場合、最初のデフォルト値は np + 1 になります。デフォルトのカラム値は、現在の分割以外のカラムの値の影響を受けません。つまり、np + 1 より小さいか p(n + 1) より大きい数には影響されません。Mobile Link または SQL Remote 経由で別のデータベースからレプリケートした場合、このような値になることがあります。
カラムに直前に挿入された値は、グローバル変数 @@identity を調べることによって確認できます。
GLOBAL AUTOINCREMENT 値は、SYSTABCOL システムビューの max_identity カラムのデータ型に応じて、符号付き 64ビット整数として保持されます。NULL 値は、分割で値が不足したときにも生成されます。NULL を入力できないように宣言されたカラムであると (プライマリキーのカラムである場合など)、SQL エラーが生成されます。この場合には、別の分割からデフォルト値を選択できるように、データベースに global_database_id の新しい値を割り当ててください。未使用の値が残り少ないことを検出し、このような状態を処理するには、GlobalAutoincrement タイプのイベントを作成します。
public オプション global_database_id は、負の値に設定できないため、選択された値は常に正になります。ID 番号の最大値を制限するのは、カラムデータ型と分割サイズだけです。
public オプション global_database_id がデフォルト値の 2147483647 に設定されると、NULL 値がカラムに挿入されます。NULL 値が許可されていない場合に、ローの挿入を試みるとエラーが発生します。
カラムに使用する次の値は、sa_reset_identity プロシージャーを使用してリセットできます。
LAST USER LAST USER は、ローを最後に変更したユーザーのユーザー ID です。
LAST USER は文字データ型のカラムでデフォルト値として使用できます。
INSERT の場合、このデフォルトは CURRENT USER と同じ効果があります。
UPDATE では、LAST USER のデフォルトを持つカラムが明示的に変更されていなければ、現在のユーザー名に変更されます。
DEFAULT TIMESTAMP または DEFAULT UTC TIMESTAMP と結合して使用すると、LAST USER のデフォルトを使用して、ローを最後に変更したユーザーと日時の両方を記録できます (ただし、別々のカラムに記録されます)。
column-constraint 句 この句はカラムに制約を追加するときに使用します。検査制約の例外を指定して新規の制約を追加すると、データベースサーバーは既存の値を検証して、制約を満たすことを確認します。テーブルの変更が完了した後に発生する操作の場合にのみ、検査制約が実行されます。使用できるカラムの制約を次に示します。
CHECK 句 この制約で、任意の条件を検証できます。たとえば、CHECK 制約を使うと、Sex というカラムには M または F の値だけが確実に入ります。
テーブル内の 2 つ以上のカラム間の関係 (カラム A はカラム B 未満である必要があるなど) が関与する CHECK 制約の作成が必要な場合は、代わりにテーブル制約を定義します。
UNIQUE 句 この句は、カラムの値をユニークにする必要があることを指定するとき、クラスタードインデックスと非クラスタードインデックスのどちらを作成するかを指定するときに使用します。
PRIMARY KEY 句 この句は、カラムをプライマリキーにするとき、クラスタードインデックスを使用するかどうかを指定するときに使用します。
REFERENCES 句 この句は、別のテーブルへの参照を追加または変更するとき、一致を処理する方法を指定するとき、クラスタードインデックスを使用するかどうかを指定するときに使用します。
MATCH 句 この句は、複数カラムの外部キーを使用するときに、何を一致と見なすかを制御するために使用します。また、キーの一意性を指定することで、一意性を別に宣言する必要がなくなります。
NULL 句と NOT NULL 句 この句は、カラムに NULL 値を許容するかどうかを指定するときに使用します。デフォルトでは、NULL を使用できます。
INLINE 句と PREFIX 句 INLINE 句は、ローに格納する最大 BLOB サイズをバイト単位で指定します。INLINE 句で指定された値以下のサイズの BLOB がローに格納されます。INLINE 句で指定された値を超えるサイズの BLOB は、ロー外のテーブル拡張ページに格納されます。また、BLOB のサイズが INLINE 句で指定された値より大きい場合、BLOB の先頭から数バイト分を複製してローに保持することができます。PREFIX 句は、ローに保持されるバイト数を指定します。ローの受け入れと拒否の判断に BLOB のプレフィクスバイトを必要とする要求のパフォーマンスは、PREFIX 句によって向上する可能性があります。
圧縮されたカラムのプレフィクスデータは圧縮されずに格納されるため、要求を満たすために必要なすべてのデータがプレフィクス内に格納されている場合は、解凍は必要ありません。
INLINE と PREFIX のどちらも指定しない場合、または USE DEFAULT を指定している場合、デフォルト値は次のように適用されます。
CHAR、NCHAR、LONG VARCHAR などの文字データ型のカラムの場合、INLINE のデフォルト値は 256 で、PREFIX のデフォルト値は 8 です。
BINARY、LONG BINARY、VARBINARY、BIT、VARBIT、LONG VARBIT、BIT VARYING、UUID など、バイナリデータ型のカラムの場合、INLINE のデフォルト値は 256 であり、PREFIX のデフォルト値は 0 です。
デフォルト以外の設定が必要な特殊な環境でない限り、デフォルト値を使用するようにしてください。デフォルト値は、パフォーマンスとディスク領域の要件のバランスをとって選択されています。たとえば、INLINE に大きな値を設定し、すべての BLOB をインラインで格納するようにした場合、ローの処理パフォーマンスは低下することがあります。また、PREFIX の値を大きくしすぎると、BLOB の一部を複製したプレフィクスデータのために、BLOB の格納に必要なディスク領域のサイズが増えることになります。
値の 1 つのみを指定する場合、その他の値は指定した値と競合しない最大の値に自動的に設定されます。INLINE 値と PREFIX 値のどちらも、データベースページサイズを超えるサイズを指定できません。また、ローデータの格納に使用できないテーブルページには、小さいサイズですが予約済みのオーバーヘッドがあります。そのため、データベースのページサイズに近い INLINE 値を指定すると、やや少ないバイト数がインラインで格納される可能性があります。
INDEX 句と NO INDEX 句 BLOB の格納時に (文字型またはバイナリ型のみ)、BLOB サイズの内部しきい値 (約 8 データベースページ) を超える挿入値に対して BLOB インデックスを作成する場合は、INDEX を指定します。これはデフォルトの動作です。
BLOB インデックスは、BLOB 内のランダムアクセス検索が必要なときにパフォーマンスを改善する可能性があります。ただし、ランダムアクセスの必要がない画像ファイルやマルチメディアファイルなど、BLOB 値の種類によっては、BLOB インデックスをオフにするとパフォーマンスが改善されることがあります。カラムの BLOB インデックスをオフにするには、NO INDEX を指定します。
BLOB インデックスは、テーブルインデックスとは異なります。テーブルインデックスは、1 つ以上のカラムの値のインデックスとして作成されます。
IDENTITY 句 IDENTITY は、DEFAULT AUTOINCREMENT の使用に対する Transact-SQL 互換の代替手段です。SQL Anywhere では、IDENTITY を指定して定義されたカラムは DEFAULT AUTOINCREMENT として実装されます。
COMPUTE 句 カラムが COMPUTE 句を使って作成される場合、すべてのローの値は式で提供されます。この制約を付けて作成されたカラムは、読み込み専用カラムです。この値は、ローが変更されるたびにデータベースサーバーによって変更されます。COMPUTE 式は、非決定的な値を返しません。たとえば、CURRENT TIMESTAMP などの特別値や非決定的関数は指定できません。COMPUTE 式が非決定的な値を返したとしても、それをクエリに含まれる式との一致に使用することはできません。
リモートテーブルでは COMPUTE 句は無視されます。
計算カラムの値を変更しようとする UPDATE 文は、そのカラムに対応するトリガーを起動します。
ADD table-constraint 句 この句はテーブルの制約を追加するときに使用します。テーブルの制約によって、テーブルのデータカラムが保持できる内容が制限されます。テーブルの制約を追加または変更するときに、オプションの制約名を使用して各制約を修正または削除することができます。追加できるテーブルの制約一覧を以下に示します。
UNIQUE この句は、column-list に指定するカラム値をユニークにすることを指定するとき、オプションでクラスタードインデックスを使用するかどうかを指定するときに使用します。
PRIMARY KEY この句は、テーブルのプライマリキーを追加または変更するとき、クラスタードインデックスを使用するかどうかを指定するときに使用します。テーブルは CREATE TABLE 文または別の ALTER TABLE 文が作成したプライマリキーを持っていてはいけません。
foreign-key この句は外部キーを制約として追加するときに使用します。従属マテリアライズドビューを持つテーブルに対して、ADD FOREIGN KEY 以外のサブ句を ALTER TABLE 文で使用すると、ALTER TABLE 文は失敗します。その他すべての句の場合は、従属マテリアライズドビューを無効にし、変更が完了してから、再度有効にする必要があります。
MATCH サブ句を指定すると、複数カラムの外部キーを使用するときに、何が一致と見なされるようにするかを制御できます。また、キーの一意性を指定することで、一意性を別に宣言する必要がなくなります。
ADD PCTFREE 句 各テーブルページに確保する空き領域の割合を指定します。空き領域は、データが更新されたときにローのサイズが増えた場合に使用されます。テーブルページに空き領域がない場合は、ページのローのサイズが増えるたびに、ローを複数のテーブルページに分割することが必要になり、ローの断片化が発生します。また、パフォーマンス低下の可能性があります。空き領域のパーセンテージを 0 に指定すると、各ページに空き領域を残さず、完全にパックします。空き領域のパーセントを高い値に設定すると、各ローは単独でページに挿入されます。PCTFREE が設定されない場合、または削除された場合、データベースのページサイズに応じたデフォルトの PCTFREE 値が適用されます (ページサイズが 4 KB 以上の場合は 200 バイト)。PCTFREE の値は、ISYSTAB システムテーブルに格納されます。PCTFREE を設定すると、テーブルページに対するそれ以降のすべての挿入操作で、新しい値が使用されます。しかし、すでに挿入済みであったローは影響を受けません。値を変更しなければ、そのままの値が維持されます。PCTFREE は、ベーステーブル、グローバルテンポラリテーブル、またはローカルテンポラリテーブルに対して指定できます。
変更の句 次の項では、カラムまたはテーブルの定義を変更するときに使用する句について説明します。
ALTER column-name column-alteration 句 この句は、指定したカラムの属性を変更するときに使用します。カラムに一意性制約、外部キー、またはプライマリキーが設定されている場合は、カラムのデフォルトのみを変更できます。ただし、その他を変更する場合は、キーまたは制約を削除してからカラムを修正してください。
column-data-type 句 この句は、カラムの長さまたはデータ型を変更するときに使用します。必要に応じて、変更されるカラムのデータを新しいデータ型に変換します。変換エラーが発生すると、操作は失敗となり、テーブルは変更されません。カラムのサイズを減らすことはできません。たとえば、VARCHAR(100) を VARCHAR(50) に変更することはできません。
[ NOT ] NULL 句 この句は、カラムに NULL を許容するかどうかの指定を変更するときに使用します。NOT NULL を指定し、既存ローのカラム値が NULL の場合、操作は失敗し、テーブルは変更されません。
CHECK NULL この句は、カラムの検査制約をすべて削除するときに使用します。
DEFAULT 句 この句は、カラムのデフォルト値を変更するときに使用します。
DEFAULT NULL 句 この句は、カラムのデフォルト値を削除するときに使用します。
[ CONSTRAINT constraint-name ] CHECK { NULL | ( condition ) } 句 この句はカラムに検査制約を追加するときに使用します。
テーブル内の 2 つ以上のカラム間の関係 (カラム A はカラム B 未満である必要があるなど) が関与する CHECK 制約の作成が必要な場合は、代わりにテーブル制約を定義します。
[ NOT ] COMPRESSED 句 この句は、カラムを圧縮するかどうかの設定を変更するときに使用します。
INLINE 句と PREFIX 句 INLINE 句は、ローに格納する最大 BLOB サイズをバイト単位で指定します。INLINE 句で指定された値以下のサイズの BLOB がローに格納されます。INLINE 句で指定された値を超えるサイズの BLOB は、ロー外のテーブル拡張ページに格納されます。また、BLOB のサイズが INLINE 句で指定された値より大きい場合、BLOB の先頭から数バイト分を複製してローに保持することができます。PREFIX 句は、ローに保持されるバイト数を指定します。ローの受け入れと拒否の判断に BLOB のプレフィクスバイトを必要とする要求のパフォーマンスは、PREFIX 句によって向上する可能性があります。
圧縮されたカラムのプレフィクスデータは圧縮されずに格納されるため、要求を満たすために必要なすべてのデータがプレフィクス内に格納されている場合は、解凍は必要ありません。
INLINE と PREFIX のどちらも指定しない場合、または USE DEFAULT を指定している場合、デフォルト値は次のように適用されます。
CHAR、NCHAR、LONG VARCHAR などの文字データ型のカラムの場合、INLINE のデフォルト値は 256 で、PREFIX のデフォルト値は 8 です。
BINARY、LONG BINARY、VARBINARY、BIT、VARBIT、LONG VARBIT、BIT VARYING、UUID など、バイナリデータ型のカラムの場合、INLINE のデフォルト値は 256 であり、PREFIX のデフォルト値は 0 です。
デフォルト以外の設定が必要な特殊な環境でない限り、デフォルト値を使用するようにしてください。デフォルト値は、パフォーマンスとディスク領域の要件のバランスをとって選択されています。たとえば、INLINE に大きな値を設定し、すべての BLOB をインラインで格納するようにした場合、ローの処理パフォーマンスは低下することがあります。また、PREFIX の値を大きくしすぎると、BLOB の一部を複製したプレフィクスデータのために、BLOB の格納に必要なディスク領域のサイズが増えることになります。
値の 1 つのみを指定する場合、その他の値は指定した値と競合しない最大の値に自動的に設定されます。INLINE 値と PREFIX 値のどちらも、データベースページサイズを超えるサイズを指定できません。また、ローデータの格納に使用できないテーブルページには、小さいサイズですが予約済みのオーバーヘッドがあります。そのため、データベースのページサイズに近い INLINE 値を指定すると、やや少ないバイト数がインラインで格納される可能性があります。
INDEX 句と NO INDEX 句 BLOB の格納時に (文字型またはバイナリ型のみ)、BLOB サイズの内部しきい値 (約 8 データベースページ) を超える挿入値に対して BLOB インデックスを作成する場合は、INDEX を指定します。これはデフォルトの動作です。
BLOB インデックスは、BLOB 内のランダムアクセス検索が必要なときにパフォーマンスを改善する可能性があります。ただし、ランダムアクセスの必要がない画像ファイルやマルチメディアファイルなど、BLOB 値の種類によっては、BLOB インデックスをオフにするとパフォーマンスが改善されることがあります。カラムの BLOB インデックスをオフにするには、NO INDEX を指定します。
BLOB インデックスは、テーブルインデックスとは異なります。テーブルインデックスは、1 つ以上のカラムの値のインデックスとして作成されます。
SET COMPUTE 句 カラムが COMPUTE 句を使って作成される場合、すべてのローの値は式で提供されます。この制約を付けて作成されたカラムは、読み込み専用カラムです。この値は、ローが変更されるたびにデータベースサーバーによって変更されます。COMPUTE 式は、非決定的な値を返しません。たとえば、CURRENT TIMESTAMP などの特別値や非決定的関数は指定できません。COMPUTE 式が非決定的な値を返したとしても、それをクエリに含まれる式との一致に使用することはできません。
リモートテーブルでは COMPUTE 句は無視されます。
計算カラムの値を変更しようとする UPDATE 文は、そのカラムに対応するトリガーを起動します。
ALTER CONSTRAINT constraint-name CHECK 句 この句は、指定したテーブルの検査制約を変更するときに使用します。
テーブル内の 2 つ以上のカラム間の関係 (カラム A はカラム B 未満である必要があるなど) を指定する制約を変更する場合は、代わりにテーブル制約を定義します。
DROP DEFAULT テーブルまたは指定したカラムに設定されたデフォルト値を削除します。既存の値は変更されません。
DROP COMPUTE 指定したカラムの COMPUTE 属性を削除します。この文はテーブル内の既存の値を変更しません。
DROP CHECK テーブルまたは指定したカラムのすべての検査制約を削除します。DELETE CHECK も使用できます。
DROP CONSTRAINT constraint-name テーブルまたは指定したカラムの指定した制約を削除します。DELETE CONSTRAINT も使用できます。
DROP column-name テーブルから指定したカラムを削除します。DELETE column-name も使用できます。カラムがインデックス、一意性制約、外部キー、またはプライマリキーに含まれている場合は、インデックス、制約またはキーを削除してからカラムを削除してください。このようにするとカラムを参照する検査制約は削除されません。
DROP UNIQUE ( column-name ... ) 指定したカラムの一意性制約を削除します。この一意性制約を参照する外部キーがあれば、それも削除されます。DELETE UNIQUE ( column-name ...) も使用できます。
DROP FOREIGN KEY fkey-name 指定した外部キーを削除します。DELETE FOREIGN KEY fkey-name も使用できます。
DROP PRIMARY KEY プライマリキーを削除します。このテーブルのプライマリキーを参照するすべての外部キーも削除します。DELETE PRIMARY KEY も使用できます。
名前変更の句 次の項では、カラムまたはテーブルの定義の一部の名前変更に使用する句について説明します。
RENAME new-table-name テーブルの名前を new-table-name に変更します。場合によっては、古いテーブル名を使用しているアプリケーションを修正する必要があります。
RENAME column-name TO new-column-name カラムの名前を new-column-name に変更します。場合によっては、古いカラム名を使用しているアプリケーションを修正する必要があります。
RENAME CONSTRAINT constraint-name TO new-constraint-name 制約の名前を new-constraint-name に変更します。
ALTER TABLE...RENAME CONSTRAINT constraint-name TO new-constraint-name を RI 制約に使用すると、制約名のみが変更され、基本となるインデックス名や外部キーの役割名 (該当する場合) は変更されません。基本となるインデックス名または役割名を変更する場合は、ALTER INDEX 文を使用します。
table-alteration 句 この句は、次のテーブルの属性を変更するときに使用します。
PCTFREE DEFAULT この句は、テーブルの空き割合設定をデフォルト値 (ページサイズが 4 KB 以上の場合は 200 バイト) に変更するときに使用します。
[ NOT ] ENCRYPTED この句は、テーブルを暗号化するかどうかの設定を変更するときに使用します。テーブルを暗号化するには、データベースでテーブルの暗号化があらかじめ有効になっている必要があります。その後、データベースの作成時に指定された暗号化キーとアルゴリズムを使用してテーブルが暗号化されます。
テーブルを暗号化した後でも、暗号化前にテンポラリファイルまたはトランザクションログに含まれていたテーブルのデータはすべて暗号化されない形式で保存されます。これを解決するには、データベースを再起動してテンポラリファイルを削除します。-o オプションでバックアップユーティリティ (dbbackup) を実行するか、BACKUP 文を使用して、トランザクションログをバックアップして新規のログを開始します。
テーブルの暗号化が有効の場合、暗号化されるテーブルのテーブルページ、関連するインデックスページ、テンポラリファイルのページ、および暗号化されるテーブルのトランザクションを含むトランザクションログページが暗号化されます。
DISABLE VIEW DEPENDENCIES 句 この句は、通常の従属ビューを無効にするときにしようします。従属マテリアライズドビューは無効になりません。ALTER MATERIALIZED VIEW...DISABLE 文を実行して、それぞれの従属マテリアライズドビューを無効にします。
ALTER TABLE 文は、既存テーブルのテーブル属性 (カラム定義、制約など) を変更します。
データベースサーバーは、データベース内のオブジェクトの依存関係を追跡します。テーブルのスキームを変更すると、従属ビューに影響が及ぶ場合があります。また、変更するテーブルに依存しているマテリアライズドビューがある場合、あらかじめ ALTER MATERIALIZED VIEW...DISABLE 文を使用して無効にしておきます。
ローカルテンポラリテーブル上では ALTER TABLE を使用できません。
ALTER TABLE 文は、他の接続で現在使用中のテーブルに影響を及ぼす場合は実行できません。ALTER TABLE には時間がかかり、データベースサーバーは、文の処理中にそのテーブルを参照する処理ができません。
IMMEDIATE REFRESH として定義されたテキストインデックスが構築されたカラムを変更すると、テキストインデックスがすぐに再構築されます。テキストインデックスが AUTO REFRESH または MANUAL REFRESH として定義されている場合は、テキストインデックスが次回の再表示時に再構築されます。
ALTER TABLE 文を実行すると、データベースサーバーは、自動的に再コンパイルされる従属ビューに対するカラムパーミッションをリストアしようとします。再コンパイルされたビューに存在しないカラムに対するパーミッションは、失われます。
次のいずれかであることが必要です。
テーブルの所有者
DBA 権限を持つユーザー
テーブルに対する ALTER パーミッションを付与されたユーザー
ALTER TABLE には、テーブルへの排他的アクセスが必要です。
グローバルテンポラリテーブルは、このテンポラリテーブルを参照したすべてのユーザーが切断されるまで変更できません。
スナップショットトランザクション内では使用できません。
オートコミット。
チェックポイントは ALTER TABLE 操作の開始時に実行されます。また、ALTER 操作が完了するまでチェックポイントは中断されます。
カラムまたはテーブルを変更すると、変更を加えたカラムを参照するストアドプロシージャー、ビュー、その他のアイテムは動作しなくなる場合があります。
宣言されたカラムの長さまたは型を変更した場合、またはカラムを削除した場合、そのカラムの統計情報は削除されます。
SQL/2008 ALTER TABLE はコア機能です。SQL/2008 標準では、ADD CONSTRAINT と DROP CONSTRAINT と同様に、ADD COLUMN と DROP COLUMN がコア機能としてサポートされています。カラムの DEFAULT 値を追加、変更、削除する ALTER [COLUMN] は、SQL 機能 F381 です。SQL/2008 でカラムのデータ型を変更するには、SQL 言語機能 F382 である SET DATA TYPE 句を指定します。ただし、SQL Anywhere では、ALTER 句を直接指定してカラムのデータ型を変更できます。
ALTER CONSTRAINT、RENAME、PCTFREE、ENCRYPTED、DISABLE MATERIALIZED VIEW など、SQL Anywhere でサポートされている他の句はベンダー拡張です。カラム定義や、カラムとテーブルの制約定義に対する拡張機能のサポートは、SQL/2008 のベンダー拡張であるか、SQL/2008 固有のオプション機能です。
Transact-SQL ALTER TABLE は、Adaptive Server Enterprise でサポートされています。Adaptive Server Enterprise では、ADD CONSTRAINT と DROP CONSTRAINT 以外に、ADD COLUMN 句と DROP COLUMN 句がサポートされています。Adaptive Server Enterprise では、ALTER 句のキーワード ALTER ではなく MODIFY が使用されます。Adaptive Server Enterprise では、カラムの DEFAULT 値の変更に REPLACE 句が使用されます。Adaptive Server Enterprise では、特定のテーブルのトリガーを有効/無効にするときに ALTER TABLE も使用されます。この機能は、SQL Anywhere ではサポートされていません。
次の例は、新しいタイムスタンプカラム TimeStamp を Customers テーブルに追加します。
ALTER TABLE Customers ADD TimeStamp AS TIMESTAMP DEFAULT TIMESTAMP; |
次の例は、前の例で追加した新しいタイムスタンプカラム TimeStamp を削除します。
ALTER TABLE Customers DROP TimeStamp; |
Customers テーブルの Street カラムは、現在 35 文字まで保持できます。最大 50 文字まで保持できるようにするには、次を実行します。
ALTER TABLE Customers ALTER Street CHAR(50); |
次の例は、Customers テーブルにカラムを追加して、各顧客に販売担当を割り当てます。
ALTER TABLE Customers ADD SalesContact INTEGER REFERENCES Employees ( EmployeeID ) ON UPDATE CASCADE ON DELETE SET NULL; |
この外部キーは、カスケード更新で構成され、削除される時に NULL が設定されます。従業員がその従業員 ID を変更すると、カラムが更新してこの変更を反映します。従業員が会社を辞めて、従業員 ID が削除されると、カラムは NULL に設定されます。
次の例は、SalesOrders.SalesRepresentative カラムに外部キー FK_SalesRepresentative_EmployeeID2 を作成し、Employees.EmployeeID にリンクします。
ALTER TABLE GROUPO.SalesOrders ADD CONSTRAINT FK_SalesRepresentative_EmployeeID2 FOREIGN KEY ( SalesRepresentative ) REFERENCES GROUPO.Employees (EmployeeID); |
次の例では、デフォルトが AUTOINCREMENT であるカラムを追加します。この例では、カラム値を割り当てられた NULL 入力可の AUTOINCREMENT カラムを含むように既存のすべての顧客ローが変更されますが、データベースサーバーはどのローにどの値が割り当てられるかを保証しません。
ALTER TABLE Customers ADD Surrogate_key INTEGER DEFAULT AUTOINCREMENT; |
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |