ALTER TABLE

Name

ALTER TABLE  --  テーブルの特性を変更する。

Synopsis

ALTER TABLE table [ * ]
    ADD [ COLUMN ] column type
ALTER TABLE table [ * ]
    ALTER [ COLUMN ] column { SET DEFAULT value | DROP DEFAULT }
ALTER TABLE table [ * ]
    RENAME [ COLUMN ] column TO newcolumn
ALTER TABLE table
    RENAME TO newtable
ALTER TABLE table
    ADD table constraint definition
  

入力

table

変更する、既存のテーブル名。

column

新規、もしくは既存の列名。

type

新規列の型。

newcolumn

既存列に対する新しい名前。

newtable

テーブルの新しい名前。

table constraint definition

テーブルの新しいテーブル制約。

出力

ALTER

列、もしくはテーブルの名前の変更時に返されるメッセージ。

ERROR

テーブル、もしくは列が使用できなかった場合に返され るメッセージ。

説明

ALTER TABLE は既存のテーブルの定義を 変更します。 ADD COLUMN 形式は、 CREATE TABLE と同じ構文を使用して、テーブルに新しい列を追加します。 ALTER COLUMN 形式を使用して、列のデ フォルト値の設定と削除ができます。 このデフォルト値がこの後に挿入される行に対してのみ適用され ることに注意して下さい。 RENAME 句を使用して、対象とするテーブル 内に含まれるデータを全く変更することなく、テーブル、もしく は列の名前を変更することができます。 このため、このコマンドが実行された後も、テーブル、もしくは 列は同じ型と同じ大きさになります。 ADD table constraint definition 句は、 CREATE TABLE と同じ構文を使用して、テーブルに新しい制約を追加します。

テーブルのスキーマを変更するためには、そのテーブルを所有 していなければなりません。

注意

COLUMN キーワードはノイズであり、省 略可能です。

テーブル名の後の "*" は、この文がそのテーブ ルと継承階層においてその下にあるテーブル全てに対して実行 されることを示します。 デフォルトでは、サブクラスの属性に対する追加も名称変更も 全く行なわれません。 スーパクラスの属性の追加もしくは変更の際には、これは常に 行なわれるようにすべきです。 さもなくば、スーパクラスの属性がサブクラスで失われますので、

SELECT NewColumn FROM SuperClass*
    
といった継承階層に対する問い合わせが動作しません。

現在の実装では、新規列のデフォルト句と制約句は無視されます。 後で ALTER TABLESET DEFAULT を使用してデフォルト句を設定する ことができます。 (また、 UPDATE を 使用して、新しいデフォルト値で既存の行を更新する必要がでてきます。)

現在の実装では、FOREIGN KEY 制約のみをテーブルに追加すること ができます。 一意性制約の作成または削除を行なう場合は、一意インデック スを作成して下さい。( CREATE INDEX を参照して下さい。) 検査制約を追加する場合は、 CREATE TABLE コマンドで別のパラメータを使用して、テーブルを作成し直し、デー タを再度読み込む必要があります。

スキーマを変更するためにはクラスの所有者でなければなりません。 いかなるシステムカタログのスキーマに対する名前の変更は許され ていません。 PostgreSQL ユーザガイド に継承に関す るより詳細な情報があります。

有効な引数に関するより詳細な説明については CREATE TABLE を参照して下さい。

使用法

テーブルに VARCHAR 型の列を追加します。

ALTER TABLE distributors ADD COLUMN address VARCHAR(30);
   

既存の列名を変更します。

ALTER TABLE distributors RENAME COLUMN address TO city;
   

既存のテーブル名を変更します。

ALTER TABLE distributors RENAME TO suppliers;
   

テーブルに外部キー制約を追加します。

ALTER TABLE distributors ADD CONSTRAINT distfk FOREIGN KEY (address) REFERENCES addresses(address) MATCH FULL
   

互換性

SQL92

上述の通り、デフォルトと制約をサポートしない点を除き、 ADD COLUMN 形式は準拠しています。 ALTER COLUMN 形式は完全に互換性があります。

SQL92 では ALTER TABLE 文に対して、 Postgres ではまだ直接サポートされて いない、いくつかの追加機能を規定しています。

ALTER TABLE table DROP CONSTRAINT constraint { RESTRICT | CASCADE }
      

(検査制約、一意性制約、外部キー制約といった)テーブル制約 を削除します。 一意性制約を削除する場合、一意インデックスを削除します。 他種の制約を削除する場合は、 CREATE TABLE コマンドで別のパラメータを指定して、テーブルを作成し直し、デー タを再読み込みする必要があります。

例えば、distributors テーブルの全ての制約 を削除します。

CREATE TABLE temp AS SELECT * FROM distributors;
DROP TABLE distributors;
CREATE TABLE distributors AS SELECT * FROM temp;
DROP TABLE temp;
       

ALTER TABLE table DROP [ COLUMN ] column { RESTRICT | CASCADE }
      

テーブルから列を削除します。 現時点では、既存の列を削除する場合、テーブルの再作成と再 読み込みが必要です。

CREATE TABLE temp AS SELECT did, city FROM distributors;    
DROP TABLE distributors;
CREATE TABLE distributors (
    did      DECIMAL(3)  DEFAULT 1,
    name     VARCHAR(40) NOT NULL,
);
INSERT INTO distributors SELECT * FROM temp;
DROP TABLE temp;
       

列とテーブルの名前変更を行なう句は、 Postgres による SQL92 の拡張です。