1. 概要
前ページまでに続く、その他もろもろですな。
本ページは、下記のサイトを参考にさせていただきました。
「テーブルの列の NOT NULL , NULLABLE の設定を変更する」
「【DB2】既存表の列へのNOT NULL制約の付与・削除」
2. カラムの型を変更
既存のテーブルの既存の列の型を変更します。
「Oracle」での基本形は下記の形になります。
ALTER TABLE
テーブル名
MODIFY
(
カラム名1 データ型
,カラム名2 データ型
, ...
)
;
「DB2」での基本形は下記の形になります。
ALTER TABLE
テーブル名
ALTER COLUMN
カラム名
SET DATA TYPE
データ型
;
3. カラム名を変更
既存のテーブルの既存の列名を変更します。
「DB2」での基本形は下記の形になります。
ALTER TABLE
テーブル名
RENAME COLUMN
旧カラム名
TO
新カラム名
;
4. カラム削除
既存のテーブルから列を削除します。基本形は下記の形になります。
ALTER TABLE
テーブル名
DROP COLUMN
カラム名1
;
5. IBM DB2 で SQL0668N となるとき
「IBM DB2」で前項までの「SQL」で変更したテーブルにアクセスするとき「SQL0668N」「理由コード 7」「表は REORG ペンディング状態です。 これは、REORG の推奨対象となる操作が含まれる ALTER TABLE ステートメントの後に発生する可能性があります。」といエラーとなることがあります。
こういうときは
REORG TABLE テーブル名;
でたいてい解消されます。
6. PostgreSQL で varchar のバイト数を変更する
「PostgreSQL」で「varchar」のバイト数を変更するには
ALTER TABLE
テーブル名
ALTER COLUMN
カラム名 TYPE VARCHAR(バイト数)
;
7. カラムに NOT NULL 制約を付ける
これ、なんでわざわざ書くかというと次項に関係あるのでした。
かつ、他のデータベースでは、試してはいないのですが、一般的に、カラムに「NOT NULL」制約をつけるには
ALTER TABLE table_name ALTER COLUMN column_name column_type NOT NULL;
らしいのですが。
「DB2」では、上記の構文は、エラーになりまして。
下記の記述になります。
ALTER TABLE table_name ALTER COLUMN column_name SET NOT NULL;
8. キーを追加する
テーブルにキーを追加するには、「IBM DB2」の場合だと
ALTER TABLE table_name DROP CONSTRAINT key_name_;
REORG TABLE table_name;
ALTER TABLE table_name ADD CONSTRAINT table_name_PK PRIMARY KEY(column1, column2);
REORG TABLE table_name;
ちゅな感じなのですが。
このとき、既存のキーが「column1」、追加するキーが「column2」として、2度目の「ALTER TABLE」ときに
SQL0542N "column2" という名前の列は、NULL 値を含む可能性があるので、主キーお よびユニーク・キー制約の列にすることができません。
と言われちゃいました。
なるほど「DB2」に限らず、キーにするカラムは、「NOT NULL」でないといけませんね。
ということで、下記の実行になりました。
ALTER TABLE table_name DROP CONSTRAINT key_name;
ALTER TABLE table_name ALTER COLUMN column2 SET NOT NULL;
REORG TABLE table_name;
ALTER TABLE table_name ADD CONSTRAINT key_name PRIMARY KEY(column1, column2);
REORG TABLE table_name;