表の変更

表を変更するときは、ALTER COLUMN SET DATA TYPE オプションや単一トランザクション内で実行できる無制限の REORG 推奨の操作などの役立つオプションを使用できます。

ALTER TABLE の SET DATA TYPE のサポート

ALTER TABLE ステートメントの ALTER COLUMN SET DATA TYPE オプションは、すべての互換性があるタイプをサポートします。

列データ・タイプを変更すると、データが損失することがあります。 このデータ損失の一部は、キャスト規則と整合性があります。例えば、ブランクをストリングから切り捨ててもエラーは返されず、DECIMAL から INTEGER に変換すると切り捨てが発生します。 オーバーフロー・エラー、打ち切り誤差、またはキャストによって返されるその他の種類のエラーなどの予期せぬエラーの発生を防ぐために、既存の列データはスキャンされ、競合する行についてのメッセージは通知ログに書き込まれます。 列のデフォルト値も新しいデータ・タイプへの準拠を確認するためにチェックされます。

データ・スキャンでエラーが報告されなかった場合は、列タイプが新しいデータ・タイプに設定され、既存の列データが新しいデータ・タイプにキャストされます。 エラーが報告されると、ALTER TABLE ステートメントは失敗します。

VARCHAR、VARGRAPHIC、または LOB 列を、データ・タイプ優先順位リスト (データ・タイプのプロモーション のトピックを参照) にすぐに設定されるデータ・タイプへ変更する操作はサポートされていません。

SALES 表の SALES 列のデータ・タイプを INTEGER から SMALLINT に変更します。

alter table sales alter column sales set data type smallint
DB20000I  The SQL command completed successfully.

SALES 表の REGION 列のデータ・タイプを VARCHAR(15) から VARCHAR(14) に変更します。

alter table sales alter column region set data type varchar(14)
...
SQL0190N  ALTER TABLE "ADMINISTRATOR.SALES" specified attributes for column
"REGION" that are not compatible with the existing column.  SQLSTATE=42837

基本表の列タイプを変更します。 基本表に直接的または間接的に依存しているビューや関数もあります。

create table t1 (c1 int, c2 int);

create view v1 as select c1, c2 from t1;
create view v2 as select c1, c2 from v1;

create function foo1 ()
 language sql
 returns int
 return select c2 from t1;

create view v3 as select c2 from v2
 where c2 = foo1();

create function foo2 ()
 language sql
 returns int
 return select c2 from v3;

alter table t1
 alter column c1
  set data type smallint;

select * from v2;

列タイプを INTEGER から SMALLINT にダウン・キャストする ALTER TABLE ステートメントは、v1、v2、v3、および foo2 を無効にします。 再有効化据え置きセマンティクスでは、select * from v2 で v1 と v2 が正常に再有効化され、v1 と v2 の両方の c1 列が SMALLINT に変更されます。 しかし、v3 と foo2 は再有効化されません。これは、これらは無効化された後で参照されることがなく、従属関係の階層チェーンでは v2 より上にあるためです。 再有効化即時セマンティクスに基づき、ALTER TABLE ステートメントはすべての従属オブジェクトを正常に再有効化します。

単一の作業単位における複数の ALTER TABLE 操作

列のドロップ、列タイプの変更、または列の NULL 可能性プロパティーの変更などの一部の ALTER TABLE 操作によって、表が REORG ペンディング 状態になる場合があります。 この状態では、多くのタイプの照会を実行できません。いくつかのタイプの照会で表を使用できるようにするには、その前に表の再編成を実行する必要があります。 ただし、REORG ペンディング 状態の表であっても、ほとんどの場合に、REORG TABLE コマンドを実行する必要なしに ALTER TABLE ステートメントを複数回実行することができます。

Db2® バージョン 9.7以降、1 つの 作業単位内で実行できる ALTER TABLE ステートメントの数に制限はありません。 多くの場合、そうした操作を含んだ作業単位が 3 つ処理された後に、REORG TABLE コマンドを実行する必要があります。

Db2 10.5.0.5以降、表が reorg pending 状態の場合、REORG TABLE コマンドを実行する前に列のデータ・タイプを変更できるのは 1 回のみです。 この制限は、ALTER 操作が単一の作業単位内で行われる場合でも複数の作業単位にわたって行われる場合でも当てはまります。