データベース - SQL 基本構文 - テーブル作成・削除・変更 - ALTER TABLE その他

クラウディア 
1. 概要
2. カラムの型を変更
3. カラム名を変更
4. カラム削除
5. IBM DB2 で SQL0668N となるとき
6. PostgreSQL で varchar のバイト数を変更する
7. カラムに NOT NULL 制約を付ける
8. キーを追加する

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;
ハイスピードプラン