ALTER TABLE [ ONLY ] table [ * ] ADD [ COLUMN ] column type [ column_constraint [ ... ] ] ALTER TABLE [ ONLY ] table [ * ] DROP [ COLUMN ] column [ RESTRICT | CASCADE ] ALTER TABLE [ ONLY ] table [ * ] ALTER [ COLUMN ] column { SET DEFAULT value | DROP DEFAULT } ALTER TABLE [ ONLY ] table [ * ] ALTER [ COLUMN ] column { SET | DROP } NOT NULL ALTER TABLE [ ONLY ] table [ * ] ALTER [ COLUMN ] column SET STATISTICS integer ALTER TABLE [ ONLY ] table [ * ] ALTER [ COLUMN ] column SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN } ALTER TABLE [ ONLY ] table [ * ] RENAME [ COLUMN ] column TO new_column ALTER TABLE table RENAME TO new_table ALTER TABLE [ONLY ] table [ * ] ADD table_constraint ALTER TABLE [ ONLY ] table [ * ] DROP CONSTRAINT constraint_name [ RESTRICT | CASCADE ] ALTER TABLE table OWNER TO new_owner
试图更改的现存表(可能有大纲修饰)的名称. 如果声明了 ONLY,则只更改该表。 如果没有声明 ONLY,则该表及其所有后代表(如果有) 都被更新。我们可以在表名字后面附加一个 * 表示后代 表都被扫描,但是在目前的版本里,这是缺省行为。(在7.1之前的版本, ONLY 是缺省的行为。)缺省可以通过改变配置选项 SQL_INHERITANCE 来改变。
现存或新的列名称.
新列的类型.
现存列的新名称.
表的新名称.
表的新的约束定义.
要删除的现有约束的名字.
该表的新所有者的用户名.
自动删除依赖于被依赖字段或者约束的对象(比如,引用该字段的视图)。
如果字段或者约束还有任何依赖的对象,则拒绝删除该字段。 这是缺省行为。
ALTER TABLE 变更一个现存表的定义. 它有好几种子形式∶
这种形式用和 CREATE TABLE 里一样的语法向表中增加一个新的字段.
这种形式从表中删除一个字段。请注意,和这个字段相关的索引和 表约束也会被自动删除。如果任何表之外的对象依赖于这个字段, 你必须说 CASCADE --- 比如,外键参考,视图等等。
这种形式为一个字段设置或者删除缺省值.请注意缺省值只应用于 随后的 INSERT 命令;它们不会导致已经在表中的 行的数值的修改.我们也可以为视图创建缺省,这个时候它们是在视图 的 ON INSERT 规则应用之前插入 INSERT 语句中去的.
这些形式修改一个字段是否标记为允许 NULL 值或者是拒绝 NULL 值. 如果表在字段中包含非空值,那么你只可以 SET NOT NULL.
这个形式为随后的 ANALYZE 操作设置每字段的统计收集目标. 目标的范围可以在 0 到 1000 之内设置;另外,把他设置为 -1 则表示 重新恢复到使用系统缺省的统计目标。
这种形式为一个字段设置存储模式.这个设置控制这个字段 是内联保存还是保存在一个附属的表里,以及数据是否要压缩. PLAIN 必需用于定长的数值,比如 INTEGER,并且是内联的,不压缩的. MAIN 用于内联,可压缩的数据. EXTERNAL 用于外部保存,不压缩的数据, 而 EXTENDED 用于外部的压缩数据. EXTENDED 是所有支持它的数据的缺省. 使用 EXTERNAL 将令在 TEXT 字段上的子字串操作更快, 付出的代价是增加了存储空间.
RENAME 形式改变一个表的名字(或者是一个 索引,一个序列,或者一个视图)或者是表中一个独立字段的名字. 它对存储的数据没有任何影响.
这个形式给表增加一个新的约束,用的语法和 CREATE TABLE.
这个形式删除一个表上的约束. 目前,在表上的约束不要求有唯一的名字,因此可能有多个约束匹配声明的名字. 所有这样的约束都将被删除.
这个形式改变表,索引,序列或者视图的所有者为指定所有者.
要使用 ALTER TABLE,你必需拥有该表; 除了 ALTER TABLE OWNER 之外,它只能由超级用户执行.
COLUMN 关键字是多余的,可以省略.
在目前的 ADD COLUMN实现里还不支持 新列/字段的缺省(值)和 NOT NULL 子句。 新字段开始存在时所有值都是 NULL. 不过你可以随后用 ALTER TABLE 的 SET DEFAULT 形式设置缺省(值)。(你可能还想用 UPDATE 把已存在行更新为缺省值。) 如果你想标记该字段为非 null,在你为该字段的所有行输入非 null 值之后 用 SET NOT NULL.
DROP COLUMN 命令并不是物理上把字段删除, 而只是简单地把它标记为 SQL 操作中不可见的。随后对该表的插入和更新 将在该字段存储一个 NULL。因此,删除一个字段是很快的,但是它不会立即 缩减你的表在磁盘上的大小,因为被删除了的字段占据的空间还没有回收。 这些空间将随着现有的行的更新而得到回收。要立即回收空间, 我们可以做一个UPDATE所有行的假动作,然后立即 vacuum, 象这样:
UPDATE table SET col = col; VACUUM FULL table;
如果表有任何后代表,那么如果不在后代表上做同样的修改的话, 就不允许在父表上 ADD 或者 RENAME 一个字段 --- 也就是说, ALTER TABLE ONLY 将被拒绝。这样就保证了后代表总是有和父表匹配的字段。
一个递归 DROP COLUMN 操作将只有在后代表并不从任何其它 父表中继承该字段并且从来没有独立定义该字段的时候才能 删除一个后代表的字段。一个非递归的 DROP COLUMN (也就是, ALTER TABLE ONLY ... DROP COLUMN)从来不会删除任何后代字段, 而是把他们标记为独立定义的,而不是继承的。
不允许更改系统表结构的任何部分。
请参考CREATE TABLE 部分获取更多有效参数的描述. PostgreSQL 用户手册里有更多有关继承的信息.
向表中增加一个 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;
给一个字段增加一个 NOT NULL 约束∶
ALTER TABLE distributors ALTER COLUMN street SET NOT NULL;
从一个字段里删除一个 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);