ALTER TABLE table
    [ * ] ADD [ COLUMN ] column type
ALTER TABLE table
    [ * ] RENAME [ COLUMN ] column TO newcolumn
ALTER TABLE table
    RENAME TO newtable
  ALTER TABLE は、既存の表の定義を変更します。 新しい列とそれらの型が、CREATE TABLE の同じ様式 および同じ制限で指定されます。 RENAME 句は当該表に含まれるいかなるデータをも変更することなく、 表もしくは列の名前の変更を引き起こします。 したがって、その表または列は、このコマンドが実行された後、同じ 型とサイズで存続します。
表のスキーマを変更するためには、その表を所有して いなければなりません。
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/RENAME は Postgres の言語拡張です。
SQL92 は、Postgres でまだ直接サポート していないALTER TABLE 文に対するいくつかの 付加機能を規定します。
ALTER TABLE table ALTER [
       COLUMN ] column
    SET DEFAULT default
ALTER TABLE table ALTER [
       COLUMN ] column
    ADD [ CONSTRAINT >constrain> ] table-constraint
      デフォルトの値や制約を表の列の定義に設定します。 default と table-constraint 句の文法については CREATE TABLE を見て下さい。 もしdefault 句が既に存在していると、新しい定義に置き換えられます。 もし何か制約がこの列にすでに存在していると、それらは ブール代数のAND を用いて新しい制約とともに保持されます。
現在、新しいdefault 制約を既存の列に設定するためには、 その表は再作成、リロードされなければなりません。
CREATE TABLE temp AS SELECT * FROM distributors;
DROP TABLE distributors;
CREATE TABLE distributors (
    did      DECIMAL(3) DEFAULT 1,
    name     VARCHAR(40) NOT NULL,
    city     VARCHAR(30)
);
INSERT INTO distributors SELECT * FROM temp;
DROP TABLE temp;
       
      ALTER TABLE table
    DROP DEFAULT default
ALTER TABLE table
    DROP CONSTRAINT constraint { RESTRICT | CASCADE }
      default で設定されたデフォルト値やconstraint で指定された 規則を表の制約から除きます。 もしRESTRICT が指定されたら、この制約に従属したどの制約も伴わない ただ一つの制約が除かれます。 もしCASCADE が指定されたら、この制約に従属したどの制約も 除かれます。
現在、デフォルト値や制約を、既存の列から除くためには、 その表は再作成、リロードされなければなりません。
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 }
      表から列を除きます。 もし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;