SQL 解説書
ALTER TABLE ステートメントは、次のことを行うことにより、既存の表を変更します。
- 1 つまたは複数の列を表に追加する
- 基本キーの追加、あるいは除去を行う
- 1 つまたは複数の固有制約、または参照制約の追加、あるいは除去を行う
- 1 つまたは複数の検査制約定義の追加、あるいは除去を行う
- VARCHAR 列の長さを変更する
- 参照タイプ列を変更して、効力範囲を追加する
- 生成された列の生成式を変更する
- 区分化キーの追加、あるいは除去を行う
- 表属性 (データ・キャプチャー・オプション、pctfree、ロック・サイズ、追加モードなど) を変更する
- 表を記録されていない初期状態 (NOT LOGGED INITIALLY) に設定する
呼び出し
このステートメントは、アプリケーション・プログラムに組み込むか、
または動的 SQL ステートメントを使用して発行することができます。
このステートメントは、動的に準備可能な実行可能ステートメントです。
しかし、バインド・オプション DYNAMICRULES BIND を適用する場合、
ステートメントを動的に準備することはできません (SQLSTATE 42509)。
許可
このステートメントの許可 ID には、以下の特権が少なくとも 1 つ含まれている必要があります。
- 変更する表に対する ALTER 特権
- 変更する表に対する CONTROL 特権
- 表のスキーマに対する ALTERIN 特権
- SYSADM または DBADM 権限
外部キーの作成 / 消去の場合、このステートメントの許可 ID には、
親表に対する以下の特権が少なくとも 1 つ含まれている必要があります。
- その表に対する REFERENCES 特権
- 指定の親キーのそれぞれの列に対する REFERENCES 特権
- その表に対する CONTROL 特権
- SYSADM または DBADM 権限
表 T の基本キーまたは固有制約を除去するには、この親キー T に従属しているすべての表において、
ステートメントの許可 ID に以下の特権が少なくとも 1 つ含まれている必要があります。
- その表に対する ALTER 特権
- その表に対する CONTROL 特権
- 表のスキーマに対する ALTERIN 特権
- SYSADM または DBADM 権限
(fullselect を使用して) 表を要約表に変更するには、このステートメントの許可 ID に、
以下のうち少なくとも 1 つが含まれている必要があります。
- その表に対する CONTROL
- SYSADM または DBADM 権限
なおかつ、fullselect で識別された個々の表または視点に対する
以下の特権が少なくとも 1 つ含まれている必要があります。
- その表または視点に対する SELECT および ALTER 特権
- その表または視点に対する CONTROL 特権
- その表または視点に対する SELECT 特権と、
その表または視点のスキーマに対する ALTERIN 特権
- SYSADM または DBADM 権限
表を変更して要約表でなくなるようにするには、
ステートメントの許可 ID が持っている特権に、
この要約表を定義するのに使用する全選択で識別される各表または視点で、
少なくとも以下の 1 つが含まれている必要があります。
- その表または視点に対する ALTER 特権
- その表または視点に対する CONTROL 特権
- その表または視点のスキーマに対する ALTERIN 特権
- SYSADM または DBADM 権限
構文
>>-ALTER TABLE--table-name-------------------------------------->
.-------------------------------------------------------------.
V (1) .-COLUMN-. |
>-------+------+-ADD-------+-+--------+--| column-definition |--+-------+--+---+-->
| | +-| unique-constraint |--------------+ | |
| | +-| referential-constraint |---------+ | |
| | +-| check-constraint |---------------+ | |
| | '-| partitioning-key-definition |----' | |
| | .-COLUMN-. | |
| +-ALTER--+--------+--| column-alteration |---------------+ |
| +-DROP--+-PRIMARY KEY-------------------------+----------+ |
| | +--+-FOREIGN KEY-+---constraint-name--+ | |
| | | +-UNIQUE------+ | | |
| | | +-CHECK-------+ | | |
| | | '-CONSTRAINT--' | | |
| | '-PARTITIONING KEY--------------------' | |
| +-DATA CAPTURE--+-NONE---------------------------------+-+ |
| | '-CHANGES--+-------------------------+-' | |
| | '-INCLUDE LONGVAR COLUMNS-' | |
| +-ACTIVATE NOT LOGGED INITIALLY--+-------------------+---+ |
| | '-WITH EMPTY TABLE--' | |
| +-PCTFREE--integer---------------------------------------+ |
| +-LOCKSIZE--+-ROW---+------------------------------------+ |
| | '-TABLE-' | |
| +-APPEND--+-ON--+----------------------------------------+ |
| | '-OFF-' | |
| | .-CARDINALITY-. | |
| '--+-VOLATILE-----+--+-------------+---------------------' |
| '-NOT VOLATILE-' |
'-SET SUMMARY AS--+-DEFINITION ONLY--------------+---------------------'
'-| summary-table-definition |-'
>--------------------------------------------------------------><
summary-table-definition
|---(--fullselect--)--| refreshable-table-options |-------------|
refreshable-table-options
|---DATA INITIALLY--DEFERRED------------------------------------>
.-ENABLE QUERY OPTIMIZATION--.
>----REFRESH--+-DEFERRED--+---+----------------------------+----|
'-IMMEDIATE-' '-DISABLE QUERY OPTIMIZATION-'
column-alteration
|---column-name------------------------------------------------->
>-----+-SET--+-DATA TYPE--+-VARCHAR-----------+---(--integer--)--+-+>
| | +-CHARACTER VARYING-+ | |
| | '-CHAR VARYING------' | |
| '-EXPRESSION AS--(--generation-expression--)--------' |
'-ADD SCOPE--+-typed-table-name-+----------------------------'
'-typed-view-name--'
>---------------------------------------------------------------|
注:
- バージョン 1 との互換性を保つため、以下についての ADD キーワードは任意選択です。
- 名前のない PRIMARY KEY 制約
- 名前のない参照制約
- FOREIGN KEY 句の後に名前を指定した参照制約
column-definition
|--column-name----+---------------------+----------------------->
| (1) |
'-| data-type |-------'
>-----+---------------------+-----------------------------------|
'-| column-options |--'
column-options
.---------------------------------------------------------------------------------.
V |
|------+---------------------------------------------------------------------------+--+->
+-NOT NULL------------------------------------------------------------------+
| (2) |
+-| lob-options |-----------------------------------------------------------+
| (3) |
+-| datalink-options |------------------------------------------------------+
| (4) |
+-SCOPE--+-typed-table-name2-+----------------------------------------------+
| '-typed-view-name2--' |
+-+-----------------------------------+---+-+-PRIMARY KEY-+---------------+-+
| | (5) | | '-UNIQUE------' | |
| '-CONSTRAINT-------constraint-name--' +-| references-clause |---------+ |
| '-CHECK--(--check-condition--)--' |
'-| generated-column-spec |-------------------------------------------------'
>---------------------------------------------------------------|
注:
- 最初の column-option で generated-column-spec が選択された場合、
data-type を省略して、generation-expression によって計算するようにできます。
- lob-options は、
ラージ・オブジェクト・タイプ (BLOB、CLOB、および DBCLOB) と、
ラージ・オブジェクト・タイプに基づく特殊タイプに対してのみ適用されます。
- datalink-options 文節は、
DATALINK タイプと、DATALINK タイプに基づく特殊タイプに対してのみ適用されます。
- SCOPE 文節は REF タイプに対してのみ適用されます。
- バージョン 1 との互換性を保つため、
references-clause (REFERENCES 文節) を定義する column-definition (列定義) では、
CONSTRAINT キーワードを省略することができます。
generated-column-spec
|--+-| default-clause |--------------------------------+--------|
'-GENERATED ALWAYS AS--(--generation-expression--)--'
default-clause
.-WITH-.
|---+------+--DEFAULT--+------------------------------------------------------+->
+-constant---------------------------------------------+
+-datetime-special-register----------------------------+
+-USER-------------------------------------------------+
+-NULL-------------------------------------------------+
'-cast-function--(--+-constant------------------+---)--'
+-datetime-special-register-+
'-USER----------------------'
>---------------------------------------------------------------|
lob-options
.-LOGGED-----. .-NOT COMPACT--.
|---*--+------------+--*--+--------------+---*------------------|
'-NOT LOGGED-' '-COMPACT------'
datalink-options
|---LINKTYPE URL------------------------------------------------>
.-NO LINK CONTROL------------------------------.
>----+----------------------------------------------+-----------|
'-FILE LINK CONTROL--+-| file-link-options |-+-'
'-MODE DB2OPTIONS-------'
file-link-options
|---*--INTEGRITY----ALL----*--READ PERMISSION--+-FS-+----------->
'-DB-'
>----*--WRITE PERMISSION--+-FS------+--*--RECOVERY--+-NO--+----->
'-BLOCKED-' '-YES-'
>----*--ON UNLINK--+-RESTORE-+---*------------------------------|
'-DELETE--'
references-clause
|---REFERENCES--table-name----+----------------------------+---->
| .-,--------------. |
| V | |
'-(-----column-name---+---)--'
>-----| rule-clause |-------------------------------------------|
rule-clause
.-ON DELETE NO ACTION-----. .-ON UPDATE NO ACTION--.
|--*--+-------------------------+---*--+----------------------+---*-->
'-ON DELETE--+-RESTRICT-+-' '-ON UPDATE RESTRICT---'
+-CASCADE--+
'-SET NULL-'
>---------------------------------------------------------------|
unique-constraint
|--+------------------------------+---+-UNIQUE------+----------->
'-CONSTRAINT--constraint-name--' '-PRIMARY KEY-'
.-,--------------.
V |
>----(-----column-name---+---)----------------------------------|
referential-constraint
|---+-----------------------------------+----------------------->
| (1) |
'-CONSTRAINT--constraint-name-------'
.-,--------------.
V |
>----FOREIGN KEY--(-----column-name---+---)--------------------->
>-----| references-clause |-------------------------------------|
check-constraint
|--+------------------------------+----------------------------->
'-CONSTRAINT--constraint-name--'
>----CHECK--(--check-condition--)-------------------------------|
partitioning-key-definition
.-,--------------.
V |
|---PARTITIONING KEY---(-----column-name---+---)---------------->
.-USING HASHING-.
>----+---------------+------------------------------------------|
注:
- バージョン 1 との互換性を保つため、
constraint-name (制約名) を FOREIGN KEY に
続けて (CONSTRAINT キーワードなし) 指定することができます。
説明
- table-name
- 変更する表を指定します。
これは、カタログに記述されている表でなければならず、
視点、またはカタログ表を対象にすることはできません。
table-name で要約表を指定している場合、
変更は、定義のために要約表を設定することのみに限られ、
まだ記録していない部分を活動化し、pctfree、
locksize、append、または volatile を変更することだけができます。
table-name をニックネーム (SQLSTATE 42809) または
宣言された一時表 (SQLSTATE 42995) にすることはできません。
- SET SUMMARY AS
- 要約表のプロパティーの変更を許可します。
- DEFINITION ONLY
- 表が要約表とみなされなくなるように、要約表を変更します。
table-name で指定される表は、
複製ではない要約表として定義されていなければなりません (SQLSTATE 428EW)。
table-name の列の定義は変更されませんが、
照会の最適化にこの表を使用することはできなくなり、
REFRESH TABLE ステートメントも使用できなくなります。
- summary-table-definition
- 照会の最適化で使用するために、正規表を要約表に変更します。
table-name により指定される表には、以下の条件が求められます。
- 要約表として以前に定義されていてはなりません。
- タイプ付き表であってはなりません。
- 何らかの定数、固有索引、またはトリガーが定義されていてはなりません。
- 他の要約表の定義に参照されていてはなりません。
表名が基準に適合しない場合、エラーが戻されます (SQLSTATE 428EW)。
- fullselect
- 表の基礎となる照会を定義します。
既存の表の列は、fullselect の結果列と比べて、
- 列の数が同数でなければなりません。
- 全く同じデータ・タイプでなければなりません。
- 同じ順序を示す位置に同じ列名がなければなりません。
(SQLSTATE 428EW)。
要約表に fullselect を指定することについての詳細は、
CREATE TABLEを参照してください。
追加の制限事項としては、table-name は全選択で直接的にも間接的にも参照できません。
- refreshable-table-options
- 要約表を変更するためのリフレッシュ可能オプションをリストします。
- DATA INITIALLY DEFERRED
- REFRESH TABLE または SET INTEGRITY ステートメントを使用して、
表のデータを妥当性検査しなければなりません。
- REFRESH
- 表のデータを保守する方法を示します。
- DEFERRED
- REFRESH TABLE ステートメントを使っていつでも表のデータを最新表示できます。
表のデータには、
REFRESH TABLE ステートメント処理時のスナップショットである照会結果が反映されるにすぎません。
この属性を定義した要約表には、INSERT、UPDATE、
または DELETE ステートメントを使用できません (SQLSTATE 42807)。
- IMMEDIATE
- DELETE、INSERT、または UPDATE の一部として基礎表に加えられた変更は、
要約表にカスケードされます。
その場合、表の内容は、どの時刻指定でも、
指定した subselect (副選択) を処理する場合と同じ内容になります。
この属性を定義した要約表には、INSERT、UPDATE、
または DELETE ステートメントを使用できません (SQLSTATE 42807)。
- ENABLE QUERY OPTIMIZATION
- 要約表を照会の最適化に使用できるようにします。
- DISABLE QUERY OPTIMIZATION
- 要約表を照会の最適化に使用しません。
それでもその表を直接照会することはできます。
- ADD column-definition
- 列を表に追加します。
タイプ付き表を使用することはできません (SQLSTATE 428DH)。
表に既存の行がある場合には、新たに追加した列のすべての値がその表のデフォルト値になります。
新しい列はその表の最後の列になります。
つまり、当初 n 個の列があった場合、追加された列は列 n+1 になります。
n の値は 499 を超えることはできません。
新しい列を追加する場合、すべての列のバイト・カウントの合計が、
表 34 で指定した最大レコード・サイズを超えてはなりません。
詳細については、注 を参照してください。
- column-name
- 表に追加する列の名前です。
名前は非修飾でなければなりません。
表にすでにある列名は使用できません (SQLSTATE 42711)。
- data-type
- CREATE TABLEの項に示されるデータ・タイプのいずれかです。
- NOT NULL
- 列にヌル値が入るのを防止します。
default-clause (DEFAULT 文節) も指定する必要があります (SQLSTATE 42601)。
- lob-options
- LOB データ・タイプのオプションを指定します。
CREATE TABLEの lob-options を参照してください。
- datalink-options
- DATALINK データ・タイプのオプションを指定します。
CREATE TABLEの datalink-options を参照してください。
- SCOPE
- 参照タイプ列の効力範囲を指定します。
- typed-table-name2
- タイプ付き表の名前。
column-name のデータ・タイプは REF(S) でなければなりません。
S は typed-table-name2 のタイプを表します (SQLSTATE 428DM)。
値が typed-table-name2 の既存行を実際に参照していることを確認するための、
column-name のデフォルト値の検査は行われません。
- typed-view-name2
- タイプ付き視点の名前。
column-name のデータ・タイプは REF(S) でなければなりません。
S は typed-view-name2 のタイプを表します (SQLSTATE 428DM)。
値が typed-view-name2 の既存行を実際に参照していることを確認するための、
column-name のデフォルト値の検査は行われません。
- CONSTRAINT constraint-name
- 制約の名前を指定します。
制約名 (constraint-name) は、
同じ ALTER TABLE ステートメントにすでに指定されている制約、
あるいは表に既存の他の制約の名前であってはなりません (SQLSTATE 42710)。
ユーザーが制約名を指定しない場合は、
表に定義されている既存の制約の識別子の中で固有な 18 文字の識別子
59
がシステムによって生成されます。
PRIMARY KEY 制約または UNIQUE 制約とともに使用した場合、
この constraint-name は、
制約をサポートするために作成される索引の名前として使用されます。
固有制約に関連した索引名の詳細については、注 を参照してください。
- PRIMARY KEY
- これは、1 つの列からなる基本キーを定義する簡単な方法として提供されています。
したがって、PRIMARY KEY が列 C の定義で指定されている場合、
その効果は、PRIMARY KEY(C) 文節が独立した文節として指定された場合と同じです。
列にヌル値を含めることはできないので、
NOT NULL 属性も指定する必要があります (SQLSTATE 42831)。
この後の unique-constraint の説明の中の PRIMARY KEY を参照してください。
- UNIQUE
- これは、1 つの列からなる固有キーを定義する簡単な方法です。
すなわち、UNIQUE を列 C の定義に指定すると、
UNIQUE(C) 文節を独立した文節として指定した場合と同じ結果になります。
この後の unique-constraint の説明の中の UNIQUE を参照してください。
- references-clause
- これは、1 つの列からなる外部キーを定義する簡単な方法として提供されています。
したがって、REFERENCES 文節が列 C の定義に指定されている場合、
その効果は、
列として C しか指定されていない FOREIGN KEY 文節の一部として REFERENCES 文節が指定された場合と同じになります。
CREATE TABLEで references-clause を参照してください。
- CHECK (check-condition)
- これは、1 つの列に適用される検査制約を定義する簡単な方法として提供されています。
CREATE TABLE で check-condition を参照してください。
- generate-column-spec
- column-generation の詳細については、CREATE TABLEを参照してください。
- default-clause
- 列のデフォルト値を指定します。
- WITH
- 任意選択キーワード。
- DEFAULT
- INSERT で値が提供されなかった場合、
もしくは INSERT や UPDATE で DEFAULT が指定されている場合に、
デフォルト値を提供します。
DEFAULT キーワードの後に特定のデフォルト値の指定がない場合のデフォルト値は、
列のデータ・タイプによって異なります。
表 19 を参照してください。
列が DATALINK または構造タイプとして定義されている場合、
DEFAULT 節を指定することはできません。
列が特殊タイプを使用して定義される場合、列のデフォルト値は、
特殊タイプにキャストされたソース・データ・タイプのデフォルト値になります。
表 19. デフォルト値 (値が指定されない場合)
データ・タイプ
| デフォルト値
|
数値
| 0
|
固定長文字ストリング
| ブランク
|
可変長文字ストリング
| 長さ 0 のストリング
|
固定長漢字ストリング
| 2 バイトのブランク
|
可変長漢字ストリング
| 長さ 0 のストリング
|
日付
| 既存の行の場合、0001 年 1 月 1 日に対応する日付。
追加行の場合には、現在の日付。
|
時刻
| 既存の行の場合、0 時間 0 分 0 秒に対応する時刻。
追加行の場合には、現在の時刻。
|
タイム・スタンプ
| 既存の行の場合、0001 年 1 月 1 日 0 時 0 分 0 秒 0 マイクロ秒に対応する日付。
追加行の場合には、現在のタイム・スタンプ。
|
2 進ストリング (blob)
| 長さ 0 のストリング
|
column-definition から DEFAULT を省略すると、
その列のデフォルト値としてヌル値が使用されます。
DEFAULT キーワードに指定できる値のタイプは、次のとおりです。
- constant
- 列のデフォルト値として定数を指定します。
指定する定数は、次の条件を満たしていなければなりません。
- 第 3 章に示されている割り当ての規則に従って、
その列に割り当てることができる値でなければなりません。
- その列が浮動小数点データ・タイプとして定義されている場合を除き、
浮動小数点の定数を指定してはなりません。
- 定数が 10 進定数の場合、
その列のデータ・タイプの位取りを超えるゼロ以外の数字を含めてはなりません (たとえば、
DECIMAL(5,2) の列のデフォルト値として 1.234 を指定することはできません)。
- 指定する定数が 254 文字を超えてはなりません。この制約には、
引用符文字や 16 進定数の X などの先行文字も含まれます。さらに、
定数が cast-function の引き数の場合には、
完全修飾された関数名から取った文字や括弧も含めて、この制限を超えてはなりません。
- datetime-special-register
- INSERT または UPDATE の実行時における日時特殊レジスターの値 (CURRENT DATE、
CURRENT TIME、または CURRENT TIMESTAMP) を、その列のデフォルト値として指定します。
その列のデータ・タイプは、
指定した特殊レジスターに対応するデータ・タイプでなければなりません (たとえば、
CURRENT DATE を指定した場合、データ・タイプは DATE でなければなりません)。
既存の行の場合は、ALTER TABLE ステートメントが処理される時点の現行日付、現行時刻、
または現行タイム・スタンプが値として使用されます。
- USER
- INSERT または UPDATE の実行時における USER 特殊レジスターの値を、
その列のデフォルト値として指定します。
USER を指定した場合、その列のデータ・タイプは、
USER の長さ属性よりも長いか等しい文字ストリングでなければなりません。
既存の行の場合、値は ALTER TABLE ステートメントの許可 ID になります。
- NULL
- その列のデフォルト値として NULL を指定します。
NOT NULL の指定がある場合には、
DEFAULT NULL を同じ列定義に指定してはなりません。
- cast-function
- この形式のデフォルト値は、特殊タイプ (distinct type)、
BLOB、または日時 (DATE、TIME、
または TIMESTAMP) データ・タイプとして定義された列に対してのみ使用することができます。
特殊タイプの場合、BLOB や日時タイプに基づく例外があり、
関数名が列の特殊タイプの名前に一致していなければなりません。
スキーマ名で修飾されている場合には、
その特殊タイプのスキーマ名と同じでなければなりません。
修飾されていない場合には、
関数の解決に用いるスキーマ名は特殊タイプのスキーマ名と同じでなければなりません。
日時タイプに基づく特殊タイプで、デフォルト値が定数の場合、
必ず関数を使用しなければなりません。さらに、その関数名は、
暗黙または明示のスキーマ名 SYSIBM を持つ特殊タイプのソース・タイプ名に一致していなければなりません。
他の日時列の場合は、対応する日時関数も使用できます。
BLOB に基づく BLOB または特殊タイプの場合も、関数を使用する必要があります。
その関数名は、暗黙または明示のスキーマ名 SYSIBM を持つ BLOB でなければなりません。
- constant
- 引き数として定数を指定します。
指定する定数は、
特殊タイプのソース・タイプに関する定数の規則 (特殊タイプでない場合は、
データ・タイプに関する定数の規則) に従っていなければなりません。
cast-function が BLOB の場合には、定数としてストリング定数を指定する必要があります。
- datetime-special-register
- CURRENT DATE、CURRENT TIME、または CURRENT TIMESTAMP を指定します。
列の特殊タイプのソース・タイプは、
指定した特殊レジスターに対応するデータ・タイプでなければなりません。
- USER
- USER 特殊レジスターを指定します。
列の特殊タイプのソース・タイプのデータ・タイプは、
少なくとも 8 バイトの長さのストリング・データ・タイプでなければなりません。
cast-function が BLOB の場合には、長さ属性が 8 バイト以上でなければなりません。
指定した値が無効な場合、エラー (SQLSTATE 42894) が発生します。
- ADD unique-constraint
- 固有制約または基本キー制約を定義します。
基本キー制約または固有制約を、副表に追加することはできません (SQLSTATE 429B3)。
階層最上部のスーパー表の場合、制約はその表および関連する副表すべてに適用されます。
- CONSTRAINT constraint-name
- 基本キー制約、または固有制約の名前を指定します。
詳細については、
CREATE TABLE で constraint-name を参照してください。
- UNIQUE (column-name...,)
- 指定した列で構成される固有キーを定義します。
指定する列は NOT NULL として定義されていなければなりません。
各 column-name (列名) は、
表の列を指定するものでなければなりません。
また、同じ列を複数回指定することはできません。
名前は非修飾でなければなりません。
指定する列の数は 16 を超えてはならず、
保管長の合計は 1024 を超えてはなりません (列の保管長については、
Byte Counts を参照)。
それぞれの列の長さは、どれも 255 バイトを超えてはなりません。
固有キーの一部として、LOB、LONG VARCHAR、LONG VARGRAPHIC、DATALINK、
これらのタイプの特殊タイプ、
あるいは構造タイプ列を使用することはできません (列の長さ属性が 255 バイトの限界以内に収まる場合でも) (SQLSTATE 42962)。
固有キーにある一連の列は、
基本キーまたは他の固有キーの一連の列と同じにすることはできません (SQLSTATE 01543)。
60
指定する列の集合に存在する値は、固有である必要があります (SQLSTATE 23515)。
既存の索引が固有キー定義に一致するかどうかを判別する検査が行われます (索引の INCLUDE 列は無視されます)。
列の順序や方向 (ASC/DESC) の指定に関係なく、列の同じ集合を指定していると、
索引定義は一致します。
一致する索引定義が見つかると、その索引の記述は、
システムによりその索引が必要であることを示すように変更され、
索引が固有でない場合は固有索引に変更されます (固有性を確実にした後)。
その表に一致する索引が複数ある場合、既存の固有索引が選択されます (選択は任意に行われます)。
一致する索引が見つからない場合は、CREATE TABLE で説明したように、
その列に対して固有索引が自動的に作成されます。
固有制約に関連した索引名の詳細については、注 を参照してください。
- PRIMARY KEY ...(column-name,)
- 指定された列で構成される基本キーを定義します。
各 column-name (列名) は、表の列を指定していなければなりません。
また、同じ列を複数回指定することはできません。
名前は非修飾でなければなりません。
指定する列の数は 16 を超えてはならず、
保管されるそれらの長さの合計は 1024 を超えてはなりません (保管される長さの詳細は、
Byte Countsを参照)。
それぞれの列の長さは、どれも 255 バイトを超えてはなりません。
表には基本キーがあってはならず、
指定する列は NOT NULL として定義されているものでなければなりません。
基本キーの一部として、LOB、LONG VARCHAR、LONG VARGRAPHIC、DATALINK、
これらのタイプの特殊タイプ、
あるいは構造タイプ列を使用することはできません (列の長さ属性が 255 バイトの限界以内に収まる場合でも) (SQLSTATE 42962)。
基本キーの一連の列は、固有キーの一連の列と同じであってはなりません (SQLSTATE 01543)。
60一連の指定された列にある既存の値は、
固有でなければなりません (SQLSTATE 23515)。
既存の索引が基本キー定義に一致するかどうかを判別する検査が行われます (索引の INCLUDE 列は無視されます)。
列の順序や方向 (ASC/DESC) の指定に関係なく、列の同じ集合を指定していると、
索引定義は一致します。
一致する索引定義が見つかると、その索引の記述は、
その索引が 1 次索引である (システムが必要としている) ことを示すように変更され、
索引が固有でない場合は固有索引に変更されます (固有性を確実にした後)。
その表に一致する索引が複数ある場合、既存の固有索引が選択されます (選択は任意に行われます)。
一致する索引が見つからない場合は、CREATE TABLE で説明したように、
その列に対して固有索引が自動的に作成されます。
固有制約に関連した索引名の詳細については、注 を参照してください。
1 つの表には、基本キーを 1 つだけ定義することができます。
- ADD referential-constraint
- 参照制約を定義します。
CREATE TABLE で referential-constraint を参照してください。
- ADD check-constraint
- 検査制約を定義します。
CREATE TABLE の check-constraint (検査制約) の部分を参照してください。
- ADD partitioning-key-definition
- 区分化キーを定義します。
表については、単一区分のノード・グループにある表スペースで定義する必要があり、
すでに区分化キーを持っていてはなりません。
区分化キーが表にすでに存在している場合には、
新しい区分化キーを追加する前に既存のキーを除去しなければなりません。
区分化キーを、副表に追加することはできません (SQLSTATE 428DH)。
- PARTITIONING KEY (column-name...)
- 指定した列を使用して、区分化キーを定義します。
各 column-name (列名) は、表の列を指定していなければなりません。
また、同じ列を複数回指定することはできません。
名前は非修飾でなければなりません。
列のデータ・タイプが LONG VARCHAR、
LONG VARGRAPHIC、
BLOB、
CLOB、
DBCLOB、
DATALINK、
これらのいずれかのタイプの特殊タイプ、または構造タイプである場合、
区分化キーの一部として列を使用することはできません。
- USING HASHING
- データ配分の区分化方式として、ハッシュ関数を使用することを指定します。
これは、サポートされる唯一の区分化方式です。
- ALTER column-alteration
- 列の特性を変更します。
- column-name
- 表で変更する列の名前です。
column-name は、表の既存列を指定するものでなければなりません (SQLSTATE 42703)。
名前は非修飾でなければなりません。
- SET DATA TYPE VARCHAR (integer)
- 既存の VARCHAR 列の長さを増やします。
CHARACTER VARYING または CHAR VARYING を、
VARCHAR キーワードの同義語として使用することができます。
column-name のデータ・タイプは VARCHAR でなければならず、
また現行の列の最大長は integer の値以下でなければなりません (SQLSTATE 42837)。
integer の値の上限は、32672 です。
タイプ付き表を使用することはできません (SQLSTATE 428DH)。
列を変更する場合、すべての列のバイト・カウントの合計が、
表 34 で指定した最大レコード・サイズを超えてはなりません (SQLSTATE 54010)。
詳細については、注 を参照してください。
固有制約または索引で列を使用する場合、新しい長さは 255 バイトを超えてはならず、
固有制約または索引の列の保管長の合計が、1024 を超えないようにしなければなりません
(SQLSTATE 54008) (保管長については、Byte Counts を参照)。
- SET EXPRESSION AS (generation-expression)
- 列の式を、指定された generation-expression に変更します。
SET EXPRESSION AS では、
SET INTEGRITY ステートメントを使用して表を検査保留状態にする必要があります。
ALTER TABLE ステートメントの後、SET INTEGRITY ステートメントを使用して、
新しい式に対してこの列にあるすべての値を更新および検査しなければなりません。
列は、式に基づいて生成される列として定義されていなければなりません (SQLSTATE 42837)。
generation-expression は、生成される列を定義する際に適用されるのと同じ規則に適合しなければなりません。
generation-expression の結果データ・タイプは、
列のデータ・タイプに割り当て可能でなければなりません (SQLSTATE 42821)。
- ADD SCOPE
- 効力範囲が未定義である既存の参照タイプ列に、効力範囲を追加します (SQLSTATE 428DK)。
変更する表がタイプ付き表である場合、
列をスーパー表から継承することはできません (SQLSTATE 428DJ)。
例については、ALTER TYPE (構造化)を参照してください。
- typed-table-name
- タイプ付き表の名前。
column-name のデータ・タイプは REF
(S) でなければなりません。
S は typed-table-name のタイプを表します (SQLSTATE 428DM)。
値が typed-table-name の既存行を実際に参照していることを確認するための、
column-name の既存値の検査は行われません。
- typed-view-name
- タイプ付き視点の名前。
column-name のデータ・タイプは REF(S ) でなければなりません。
S は typed-view-name のタイプを表します (SQLSTATE 428DM)。
値が typed-view-name の既存行を実際に参照していることを確認するための、
column-name の既存値の検査は行われません。
- DROP PRIMARY KEY
- 基本キーの定義、およびその基本キーに従属するすべての参照制約を除去します。
表には基本キーがなければなりません。
- DROP FOREIGN KEY constraint-name
- 制約名が constraint-name の参照制約を除去します。
constraint-name (制約名) は、参照制約を指定していなければなりません。
参照制約の除去により起こることについては、注を参照してください。
- DROP UNIQUE constraint-name
- 固有制約 constraint-name の定義、
およびこの固有制約に従属するすべての参照制約を除去します。
constraint-name は、既存の UNIQUE 制約を指定していなければなりません。
固有制約の除去により起こることについては、注を参照してください。
- DROP CONSTRAINT constraint-name
- 制約名が constraint-name の制約を除去します。
constraint-name は、表に定義されている既存の検査制約、
参照制約、基本キー、または固有制約のいずれかを指定していなければなりません。
制約の除去により起こることについては、注を参照してください。
- DROP CHECK constraint-name
- 制約名が constraint-name の検査制約を除去します。
constraint-name は、
表に定義されている既存の検査制約を指定していなければなりません。
- DROP PARTITIONING KEY
- 区分化キーを除去します。
表には区分化キーがある必要があり、
表は単一区分のノード・グループで定義されている表スペースに入っている必要があります。
- DATA CAPTURE
- データの複製に関する追加情報をログに記録するか否かを指定します。
表がタイプ付き表である場合、
このオプションはサポートされません (ルート表の場合は SQLSTATE 428DH で、
他の副表の場合は 428DR)。
- NONE
- 追加情報をログに記録しないことを指定します。
- CHANGES
- この表に対する SQL 変更についての追加情報をログに書き込むことを指定します。
このオプションは、表を複製する場合で、
収集プログラムを使用してログからこの表に対する変更内容を取り込む場合に必須です。
カタログ区分以外の区分にデータが入れられるように表が定義されている場合 (複数区分のノード・グループ、
またはカタログ区分以外の区分を持つノード・グループ)、
このオプションはサポートされません (SQLSTATE 42997)。
表のスキーマ名 (暗黙または明示名) が 18 バイトより長い場合、
このオプションはサポートされません (SQLSTATE 42997)。
複製の使用法の詳細については、
管理の手引き および レプリケーションの手引きおよび解説書 を参照してください。
- INCLUDE LONGVAR COLUMNS
- データ複製ユーティリティーが、
LONG VARCHAR または LONG VARGRAPHIC 列に対する変更を取り込むようにします。
この文節は、LONG VARCHAR または LONG VARGRAPHIC 列のない表に指定することもできます。
これは、LONG VARCHAR または LONG VARGRAPHIC 列を含むよう、
表を ALTER することができるためです。
- ACTIVATE NOT LOGGED INITIALLY
- 現行の作業単位の表の NOT LOGGED INITIALLY 属性を活動化します。
NOT LOGGED INITIALLY 属性で作成された表は使用できません (SQLSTATE 429AA)。
このステートメントにより表を変更した後に、同一の作業単位の INSERT、
DELETE、UPDATE、CREATE INDEX、DROP INDEX、
または ALTER TABLE によって表に対して行われた変更は、ログ記録されません。
NOT LOGGED INITIALLY 属性が活動状態にあるときに、
ALTER ステートメントによってシステム・カタログに対して行われた変更は、ログ記録されます。
同一の作業単位内でシステム・カタログ情報に対して行われる一連の変更は、ログ記録されます。
現行の作業単位が完了すると、NOT LOGGED INITIALLY 属性は非活動化され、
それ以降の作業単位の表で行われるすべての操作はログ記録されます。
カタログ表へのデータの挿入中にロックを避けるためにこの機能を使用する場合、
ALTER TABLE ステートメントにはこの文節だけを指定してください。
ALTER TABLE ステートメントでこの文節以外のものを指定すると、
カタログがロックしてしまいます。
ALTER TABLE ステートメントでこの文節のみが指定されている場合、
SHARE ロックのみがシステム・カタログ表で獲得されます。
これにより、このステートメントが実行される時と、
このステートメントが実行される作業単位が終了する時の、
所要時間の競合が生じるのを、可能な限り抑えることができます。
表がタイプ付き表である場合、このオプションがサポートされるのは、
タイプ付き表階層のルート表でだけです (SQLSTATE 428DR)。
NOT LOGGED INITIALLY 属性の詳細については、
CREATE TABLEにあるこの属性に関する記述を参照してください。
注: | 作業単位内で NOT LOGGED INITIALLY 属性を活動化したことにより表が変更された場合、
保管点要求へのロールバックは、作業単位要求へのロールバックに変換されます (SQLSTATE 40506)。
NOT LOGGED INITIALLY 属性が活動状態にある作業単位における操作でエラーが発生すると、
その作業単位全体がロールバックされます (SQLSTATE 40506)。
さらに、NOT LOGGED INITIALLY 属性が活動化されている表は、
ロールバックされた後にアクセス不能としてマークされ、
除去しかできなくなります。
したがって、NOT LOGGED INITIALLY 属性が活動化されている作業単位内のエラーは、
最小限に抑えられます。
|
- WITH EMPTY TABLE
- 現在表にあるすべてのデータを除去します。
一度データが除去されると、
RESTORE 機能を使用しなければ、そのデータの回復を行うことができません。
この ALTER ステートメントを発行した作業単位をロールバックしても、
表データは元の状態には回復できません。
この処置が必要な場合、修復したい表に定義された DELETE トリガーは行われません。
その表にある索引もすべて空になります。
- PCTFREE integer
- ロードまたは再編成時に、各ページで空きスペースとして残しておくスペースの割合を指定します。
integer の値は 0 〜 99 です。
各ページの最初の行は、制約なしに追加されます。
行をさらに追加する場合、
各ページに少なくとも integer パーセントを空きスペースとして残します。
PCTFREE 値は、LOAD または REORGANIZE TABLE ユーティリティーでのみ有効です。
表がタイプ付き表である場合、このオプションがサポートされるのは、
タイプ付き表階層のルート表でだけです (SQLSTATE 428DR)。
- LOCKSIZE
- 表へのアクセス時に使用されるロックのサイズ (細分性) を指定します。
表定義でこのオプションを使用しても、通常のロック・エスカレーションが行われます。
表がタイプ付き表である場合、このオプションがサポートされるのは、
タイプ付き表階層のルート表でだけです (SQLSTATE 428DR)。
- ROW
- 行ロックの使用を指定します。
これは、表の作成時のデフォルトのロック・サイズです。
- TABLE
- 表ロックの使用を指定します。
これは、適切な共用ロックまたは排他ロックが表で獲得されており、
意図ロック ("意図なし" は除く) が使用されないことを意味します。
この値を使用すると、獲得すべきロック数が限定されるため、照会のパフォーマンスが向上します。
しかし、完全な表に対してはロックがすべて保留となるため、並行性も限定されます。
ロックの詳細については、管理の手引き を参照してください。
- APPEND
- データを表データの終わりに追加するか、
またはデータ・ページの空きスペースが使用可能な場所に追加するかを指定します。
表がタイプ付き表である場合、このオプションがサポートされるのは、
タイプ付き表階層のルート表でだけです (SQLSTATE 428DR)。
- ON
- 表データが追加され、各ページの空きスペース情報は保持されません。
表にはクラスター索引があってはなりません (SQLSTATE 428CA)。
- OFF
- 表データは使用可能なスペースに入れられます。
これは、表の作成時のデフォルト値です。
APPEND OFF を設定した後に表の再編成が必要となります。
これは、使用可能な空きスペース情報が不正確となるため、
データ挿入時のローパフォーマンスにつながるからです。
- VOLATILE
- これを指定することにより、最適化プログラムに対し、
表 table-name のカーディナリティーが、空から非常に大きなものに至るまで、
実行時に変化し得ることを知らせます。
table-name にアクセスするため、最適化プログラムは、
その統計に関係なく、表のスキャンではなく索引のスキャンを使います。
ただしその場合、その索引は索引専用である (参照されるすべての列がその索引内にある) か、
索引のスキャンで述部を使えることが条件になります。
表がタイプ付き表である場合、このオプションがサポートされるのは、
タイプ付き表階層のルート表でだけです (SQLSTATE 428DR)。
- NOT VOLATILE
- これを指定することにより、最適化プログラムに対して、
table-name のカーディナリティーが揮発ではないことを知らせます。
この表に対するアクセス・プランは、既存の統計と、
所定の最適化レベルに基づいて続けられます。
- CARDINALITY
- 揮発するのが表内の行数であり、表そのものではないことを示す任意選択キーワード。
規則
- 表の区分化キー列は更新できません (SQLSTATE 42997)。
- 表に対して定義された固有キー制約または基本キー制約は、
区分化キー (存在する場合) のスーパーセットである必要があります (SQLSTATE 42997)。
- 区分化キーのヌル可能な列は、
関係が ON DELETE SET NULL を指定して定義されている場合は、
外部キーの列として組み込むことはできません (SQLSTATE 42997)。
- 1 つの列の参照は、
1 つの ALTER TABLE ステートメント内の 1 つの ADD または ALTER COLUMN 文節でのみ
可能です (SQLSTATE 42711)。
- 表に要約表があり、その表に従属している場合、
列の長さを変更することはできません (SQLSTATE 42997)。
- 生成された列を追加する前に、SET INTEGRITY ステートメントを使用して、
表を検査保留状態に設定しなければなりません (SQLSTATE 55019)。
注
例
例 1:
1 文字の長さの RATING という名前の新しい列を、DEPARTMENT 表に追加します。
ALTER TABLE DEPARTMENT
ADD RATING CHAR(1)
例 2:
SITE_NOTES という名前の新しい列を PROJECT 表に追加します。
SITE_NOTES は、最大 1000 文字の長さの可変長列として作成します。
この列の値には関連する文字セットがなく、変換されません。
ALTER TABLE PROJECT
ADD SITE_NOTES VARCHAR(1000) FOR BIT DATA
例 3:
以下の列が定義された EQUIPMENT という表が存在するものと想定します。
Column Name Data Type
EQUIP_NO INT
EQUIP_DESC VARCHAR(50)
LOCATION VARCHAR(50)
EQUIP_OWNER CHAR(3)
EQUIPMENT 表に、
所有者 (EQUIP_OWNER) は DEPARTMENT 表に存在する部門番号 (DEPTNO) でなければならない、
という参照制約を追加します。
DEPTNO は、DEPARTMENT 表の基本キーです。
DEPARTMENT 表からある部門を削除する場合は、
その部門の所有するすべての備品の所有者
(EQUIP_OWNER) の値を割り当て解除する必要があります (つまりヌル値に設定する必要があります)。
制約の名前は、DEPTQUIP です。
ALTER TABLE EQUIPMENT
ADD CONSTRAINT DEPTQUIP
FOREIGN KEY (EQUIP_OWNER)
REFERENCES DEPARTMENT
ON DELETE SET NULL
さらに、備品レコードに関係した数量を記録できるようにするため、
追加の列が必要になります。
特に指定されない限り、EQUIP_QTY 列には値 1 を入れます。
ヌル値にしてはなりません。
ALTER TABLE EQUIPMENT
ADD COLUMN EQUIP_QTY
SMALLINT NOT NULL DEFAULT 1
例 4:
表 EMPLOYEE を更新します。
各従業員の給与と歩合の合計が $30,000 を超えていなければならない、
という定義済みの REVENUE という名前の検査制約を追加します。
ALTER TABLE EMPLOYEE
ADD CONSTRAINT REVENUE
CHECK (SALARY + COMM > 30000)
例 5:
表 EMPLOYEE を更新します。
前に定義した制約 REVENUE を除去します。
ALTER TABLE EMPLOYEE
DROP CONSTRAINT REVENUE
例 6:
SQL の変更内容をデフォルトのフォーマットでログに記録するように表を更新します。
ALTER TABLE SALARY1
DATA CAPTURE NONE
例 7:
SQL の変更内容を拡張フォーマットでログに記録するように表を更新します。
ALTER TABLE SALARY2
DATA CAPTURE CHANGES
例 8:
EMPLOYEE 表を更新して、デフォルト値を指定して 4 つの新しい列を追加します。
ALTER TABLE EMPLOYEE
ADD COLUMN HEIGHT MEASURE DEFAULT MEASURE(1)
ADD COLUMN BIRTHDAY BIRTHDATE DEFAULT DATE('01-01-1850')
ADD COLUMN FLAGS BLOB(1M) DEFAULT BLOB(X'01')
ADD COLUMN PHOTO PICTURE DEFAULT BLOB(X'00')
デフォルト値の指定時に、これらのデフォルト値はさまざまな関数名を使用します。
MEASURE は INTEGER に基づく特殊タイプなので、MEASURE 関数を使用しています。
ちなみに、HEIGHT 列のデフォルト値は、関数を使用しなくても指定することができたはずです。
MEASURE のソース・タイプは、BLOB または日時データ・タイプではないからです。
BIRTHDATE は DATE に基づく特殊タイプなので、
DATE 関数を使用しています (この場合、BIRTHDATE は使用できません)。
FLAGS 列と PHOTO 列では、PHOTO が特殊名であるにもかかわらず、
BLOB 関数を使用してデフォルト値が指定されています。
BIRTHDAY、FLAGS、
および PHOTO 列のデフォルト値を指定するためには、関数を使用しなければなりません。
タイプが、BLOB や日時データ・タイプのソースに基づく BLOB や特殊タイプだからです。
例 9:
以下の列が定義された CUSTOMERS という表があると想定します。
Column Name Data Type
BRANCH_NO SMALLINT
CUSTOMER_NO DECIMAL(7)
CUSTOMER_NAME VARCHAR(50)
この表では、基本キーは BRANCH_NO 列と CUSTOMER_NO 列からなります。
表を区分化したいので、表に対して区分化キーを作成する必要があります。
表は単一ノードのノード・グループにある表スペースに定義する必要があります。
基本キーは、区分化列のスーパーセットである必要があり、
基本キーの少なくとも 1 つの列が区分化キーとして使用されている必要があります。
BRANCH_NO を区分化キーにしたいと想定します。
以下のステートメントを用いてこれを行います。
ALTER TABLE CUSTOMERS
ADD PARTITIONING KEY (BRANCH_NO)
脚注:
- 59
-
識別子は、"SQL" と、タイム・スタンプに基づいて生成された 15 個の数字からなります。
- 60
-
LANGLEVEL が SQL92E または MIA の場合には、
エラーが戻されます (SQLSTATE 42891)。
- 61
-
基本キーまたは固有キーが、前のバージョンで作成された既存の固有索引を使用しており、
固有性の据え置きをサポートするように変換されていない場合、索引は変換され、
関連した表の更新使用のパッケージは無効になります。
[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]