ALTER TABLE(7) | SQL Commands | ALTER TABLE(7) |
ALTER TABLE - 修改表的定义
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);
ADD COLUMN 形式是兼容 SQL 标准的, 除了上面说的缺省(值)和 NOT NULL 约束外。 ALTER COLUMN 形式是完全兼容的。
重命名表,列/字段,索引,和序列的名字是
PostgreSQL 对 SQL 的扩展。
ALTER TABLE DROP COLUMN 可以用于删除表中的唯一的一个字段, 留下一个零字段的表。这是对 SQL 的扩展,它不允许零字段表。
Postgresql 中文网站 何伟平 <laser@pgsqldb.org>
本页面中文版由中文
man 手册页计划提供。
中文 man
手册页计划:https://github.com/man-pages-zh/manpages-zh
2003-11-02 | SQL - Language Statements |