ALTER TABLE [ ONLY ] name [ * ]
    ADD [ COLUMN ] column type [ column_constraint [ ... ] ]
ALTER TABLE [ ONLY ] name [ * ]
    DROP [ COLUMN ] column [ RESTRICT | CASCADE ]
ALTER TABLE [ ONLY ] name [ * ]
    ALTER [ COLUMN ] column { SET DEFAULT expression | DROP DEFAULT }
ALTER TABLE [ ONLY ] name [ * ]
    ALTER [ COLUMN ] column { SET | DROP } NOT NULL
ALTER TABLE [ ONLY ] name [ * ]
    ALTER [ COLUMN ] column SET STATISTICS integer
ALTER TABLE [ ONLY ] name [ * ]
    ALTER [ COLUMN ] column SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN }
ALTER TABLE [ ONLY ] name [ * ]
    SET WITHOUT OIDS
ALTER TABLE [ ONLY ] name [ * ]
    RENAME [ COLUMN ] column TO new_column
ALTER TABLE name
    RENAME TO new_name
ALTER TABLE [ ONLY ] name [ * ]
    ADD table_constraint
ALTER TABLE [ ONLY ] name [ * ]
    DROP CONSTRAINT constraint_name [ RESTRICT | CASCADE ]
ALTER TABLE name
    OWNER TO new_owner
ALTER TABLE name
    CLUSTER ON index_name
ALTER TABLE 变更一个现存表的定义。它有好几种子形式:
 要使用 ALTER TABLE,你必需拥有该表; 除了 ALTER TABLE OWNER 之外,它只能由超级用户执行。 
 COLUMN 关键字是多余的,可以省略。 
 在目前的 ADD COLUMN实现里还不支持新列/字段的缺省(值)和 NOT NULL 子句。 新字段开始存在时所有值都是 NULL。 不过你可以随后用 ALTER TABLE 的 SET DEFAULT  形式设置缺省(值)。(你可能还想用 
UPDATE [update(7)] 把已存在行更新为缺省值。) 如果你想标记该字段为非 null,在你为该字段的所有行输入非 null 
值之后用 SET NOT NULL。 
DROP COLUMN 命令并不是物理上把字段删除, 而只是简单地把它标记为 SQL 操作中不可见的。随后对该表的插入和更新将在该字段存储一个 NULL。 因此,删除一个字段是很快的,但是它不会立即缩减你的表在磁盘上的大小,因为被删除了的字段占据的空间还没有回收。 这些空间将随着现有的行的更新而得到回收。要立即回收空间, 我们可以做一个UPDATE所有行的假动作,然后立即 vacuum, 象这样:
UPDATE table SET col = col; VACUUM FULL table;
 如果表有任何后代表,那么如果不在后代表上做同样的修改的话, 就不允许在父表上增加或者重命名一个字段,也就是说, ALTER TABLE ONLY将被拒绝。这样就保证了后代表总是有和父表匹配的字段。 
 一个递归DROP COLUMN  操作将只有在后代表并不从任何其它父表中继承该字段并且从来没有独立定义该字段的时候才能删除一个后代表的字段。 一个非递归的DROP COLUMN(也就是,ALTER TABLE ONLY ... DROP COLUMN)从来不会删除任何后代字段, 而是把他们标记为独立定义的,而不是继承的。 
 不允许更改系统表结构的任何部分。 
 请参考CREATE TABLE 部分获取更多有效参数的描述。 Chapter 5 ``Data Definition‘‘ 里有更多有关继承的信息。 
 向表中增加一个 varchar 列: 
ALTER TABLE distributors ADD COLUMN address varchar(30);
 从表中删除一个字段: 
ALTER TABLE distributors DROP COLUMN address RESTRICT;
 对现存列改名: 
ALTER TABLE distributors RENAME COLUMN address TO city;
 更改现存表的名字∶ 
ALTER TABLE distributors RENAME TO suppliers;
 给一个字段增加一个非空约束: 
ALTER TABLE distributors ALTER COLUMN street SET NOT NULL;
 从一个字段里删除一个非空约束:
ALTER TABLE distributors ALTER COLUMN street DROP NOT NULL;
 给一个表增加一个检查约束: 
ALTER TABLE distributors ADD CONSTRAINT zipchk CHECK (char_length(zipcode) = 5);
 删除一个表和它的所有子表的监查约束: 
ALTER TABLE distributors DROP CONSTRAINT zipchk;
 向表中增加一个外键约束: 
ALTER TABLE distributors ADD CONSTRAINT distfk FOREIGN KEY (address) REFERENCES addresses (address) MATCH FULL;
 给表增加一个(多字段)唯一约束: 
ALTER TABLE distributors ADD CONSTRAINT dist_id_zipcode_key UNIQUE (dist_id, zipcode);
 给一个表增加一个自动命名的主键约束,要注意的是一个表只能有一个主键: 
ALTER TABLE distributors ADD PRIMARY KEY (dist_id);
原文:https://www.cnblogs.com/fanweisheng/p/11076159.html