ALTER TABLE

ALTER TABLE コマンドは、既存表の構造の変更に使用します。 アクティブな照会により表が使用されている場合は、その照会の終了を待って ALTER コマンドが実行されます。

ALTER TABLE コマンドは、以下のタスクに使用します。
  • 列デフォルトを変更または除去する。 設定したデフォルトは、以降の INSERT コマンドのみに適用され、表の既存の行には適用されません。
  • 列または表内のデータ・タイプやサイズは変更せず列または表の名前を変更する。 キーワード列は省略できます。
  • 表制約または列制約を追加または除去する。 制約を変更することはできません。 変更したい場合には、制約を除去して新規作成する必要があります。
  • varchar 列の長さを変更する。

表がストアード・プロシージャーから参照されている場合は、列を追加したり除去したりすることができません。 ALTER TABLE コマンドを実行する前に、まずストアード・プロシージャーを除去し、表が変更された後で、ストアード・プロシージャーを再作成する必要があります。

構文

表を変更する場合の構文
ALTER TABLE <table> <action> [ORGANIZE ON {(<columns>) | NONE}]
ここで、<action> は以下のいずれかになります。
ADD COLUMN <col> <type> [<col_constraint>][,…] |
ADD <table_constraint> |
ALTER [COLUMN] <col> { SET DEFAULT <value> | DROP DEFAULT } |
DROP [COLUMN] column_name[,column_name…] {CASCADE | RESTRICT } |
DROP CONSTRAINT <constraint_name> {CASCADE | RESTRICT} |
MODIFY COLUMN (<col> VARCHAR(<maxsize>)) |
OWNER TO <user_name> |
RENAME [COLUMN] <col> TO <new_col_name> |
RENAME TO <new_table> |
SET PRIVILEGES TO <table> 
ここで、<col_constraint> は、以下を表します。
[ CONSTRAINT <constraint_name> ] 
{NOT NULL | NULL | UNIQUE | PRIMARY KEY | DEFAULT <value> | <ref>}
[ [ [ NOT ] DEFERRABLE ] { INITIALLY DEFERRED | INITIALLY IMMEDIATE } |
[ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] [ NOT ] DEFERRABLE ]
ここで、<table_constraint> は、以下を表します。
[ CONSTRAINT <constraint_name> ] 
{UNIQUE (<col>[,<col>…] ) |
PRIMARY KEY (<pkcol_name>[,<pkcol_name>…] ) |
FOREIGN KEY (<fkcol_name>[,<fkcol_name>…] ) <ref>}
[ [ [ NOT ] DEFERRABLE ] { INITIALLY DEFERRED | INITIALLY IMMEDIATE } |
[ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] [ NOT ] DEFERRABLE ]
ここで、<ref> は、以下を表します。
REFERENCES <reftable> [ (<refcol_name>[,<refcol_name>…] ) ]
[ MATCH FULL ]
[ ON UPDATE {CASCADE | RESTRICT | SET NULL | SET DEFAULT | NO ACTION} ]
[ ON DELETE {CASCADE | RESTRICT | SET NULL | SET DEFAULT | NO ACTION} ]

入力

ALTER TABLE コマンドの入力は以下のとおりです。

表 1. ALTER TABLE の入力
入力 説明
<table> 変更する表の名前。
&amp; lt; /アクション> 指定された表に対して実行するアクション。
ADD COLUMN
列を追加します。 この入力は、トランザクション・ブロックでは指定できません。
ADD <table_constraint>
表制約を追加します。
ALTER [COLUMN]
列のデフォルト値を変更または除去します。
DROP [COLUMN]
列を除去します。 除去した列に依存する制約も自動的に除去されます。 この入力は、トランザクション・ブロックでは指定できません。 distribution 列、「organize on」列、表内の最後に残った 1 列は、いずれも除去できません。

列を除去した場合にその除去した列名を再使用するには、まず GROOM TABLE <tablename> VERSIONS コマンドを実行します。このコマンドを実行しないとエラーが起きる可能性があります。

DROP CONSTRAINT
制約を除去します。
MODIFY COLUMN
列の長さを変更します。
OWNER TO
表の所有者を変更します。
RENAME [COLUMN]
列の名前を変更します。
RENAME TO
表の名前を変更します。
SET PRIVILEGES TO
変更した表の特権を別の表の特権に設定します。
<col> 列の名前。
<user_name> ユーザーの名前。
<new_col_name> 列に付けられる新しい名前。
<new_table> 表の新しい名前
ORGANIZE ON 表の編成の対象となる列 (1 から 4 列)。 これは外部表には指定できません。 列が指定されている場合、表にマテリアライズ・ビューを含めることができません。さらに、指定されたすべての列データ型はゾーン・マップ可能でなければなりません。 表データの再編成は、GROOM TABLE が実行されるときに有効になります。 詳細については、『IBM® Netezza®システム管理者ガイド』の「クラスタ化ベース・テーブルの使用」を参照してください。
<constraint_name> 列制約または表制約に付けられる名前。 名前を指定しない場合、システムが名前を生成します。
NOT DEFERRABLE | DEFERRABLE 制約をトランザクションの終了まで延期できるかどうかを制御します。 デフォルトは、NOT DEFERRABLE です。 Netezza Performance Serverは制約チェックと参照整合性をサポートしていません)
INITIALLY DEFERRED (トランザクションの終了時点) または IMMEDIATE (それぞれの文の終了時点) のいずれかを指定します。
NOT NULL | NULL 列に NULL 値を含めることができるかどうか。 NULL がデフォルトです。
UNIQUE (列および表制約) 列の各値が固有である必要があるかどうか。
PRIMARY KEY (列および表制約) 指定した列が表の主キーを形成するかどうか。

この制約は、本質的に UNIQUE 制約と NOT NULL 制約を組み合わせたものですが、列のセットを主キーとして指定することで、スキーマの設計に関するメタデータにもなります。 主キーは、他の表から、この列セットを行の固有 ID として信頼できることを意味します。

列制約として、または表制約として、1 つの表に対して 1 つの PRIMARY KEY 制約のみを指定できます。

主キーを構成する列セットは、その表に対して定義された UNIQUE 制約で指定された列の他のセットとは異っている必要があります。

DEFAULT (列制約) この列の各行に配置されるデフォルト値。
REFERENCES (列制約) 新規表の指定された列には、指定された表の指定された列内の値と一致する値のみが含まれている必要があります。
FOREIGN KEY および REFERENCES 表 (表制約) 新規表の指定された列には、指定された表の指定された列内の値と一致する値のみが含まれている必要があります。 列を指定しない場合、値は表の主キーと一致している必要があります。 参照表の指定された列には、その表の UNIQUE 制約または PRIMARY KEY 制約が必要です。
MATCH FULL MATCH FULL を指定すると、複数列からなる外部キーの 1 つの列は、外部キーの他の部分が NULL ではない場合に、NULL を持つことができません。 これがデフォルトです。 MATCH PARTIAL はサポートされません。
ON UPDATE | ON DELETE 指定された表または列が更新または削除されたときに実行されるアクション。
NO ACTION
外部キーが違反の場合に、エラーが発行されます。 これがデフォルトです。
RESTRICT
NO ACTION と同じです。
CASCADE
削除された行を参照するすべての行を削除します。
SET NULL
参照している列の値をデフォルト値に設定します。
SET DEFAULT
参照している列の値をデフォルト値に設定します。

出力

ALTER TABLE コマンドは以下の出力を生成します。

表 2. ALTER TABLE の出力
出力 説明
ALTER コマンドは成功します。
ERROR 指定した表または列は使用できません。

特権

admin ユーザー、表の所有者、または表が定義されたデータベースかスキーマの所有者であるか、あるいはアカウントがその表または Table オブジェクト・クラスに対する Alter 特権を持っている必要があります。 表の所有者を変更する場合、そのユーザー・アカウントに対する List アクセス権限が必要です。

使用法

以下に使用例を示します。
  • 列からデフォルトを除去します。
    MYDB.SCH1(USER)=> ALTER TABLE distributors ALTER COLUMN address DROP
    DEFAULT;
  • 列の varchar の長さを変更します。
    MYDB.SCH1(USER)=> ALTER TABLE t3 MODIFY COLUMN (col1 VARCHAR(6));
  • 列の名前を変更します。
    MYDB.SCH1(USER)=> ALTER TABLE distributors RENAME COLUMN address TO
    city;
  • 表の名前を変更します。
    MYDB.SCH1(USER)=> ALTER TABLE distributors RENAME TO suppliers;
  • 表の所有者を変更します。
    MYDB.SCH1(USER)=> ALTER TABLE distributors OWNER TO carmen;
  • 特権を別の表に対して設定された特権に変更します。
    MYDB.SCH1(USER)=> ALTER TABLE distributors SET PRIVILEGES TO suppliers;
  • 制約を追加します。
    MYDB.SCH1(USER)=> ALTER TABLE distributors ADD CONSTRAINT empkey
    PRIMARY KEY(col1) INITIALLY IMMEDIATE;
  • 制約を除去します。
    MYDB.SCH1(USER)=> ALTER TABLE distributors DROP CONSTRAINT empkey
    CASCADE;