ALTER TABLE [ ONLY ] table [ * ] ADD [ COLUMN ] column type ALTER TABLE [ ONLY ] 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 ALTER TABLE table OWNER TO new owner
ALTER TABLE 变更一个现存表的定义. ADD COLUMN 形式使用与 CREATE TABLE一样的语法向表中增加一个新列/字段。 ALTER COLUMN 形式允许你从列/字段中设置或者删除缺省(值)。 注意缺省(值)只对新插入的行有效。 RENAME 子句可以在不影响相关表中任何数据的情况下更改 一个表或者列/字段的名称。因此, 表或列/字段在此命令执行后仍将是相同尺寸和类型。 ADD table constraint definition 子句使用与 CREATE TABLE 一样的语法向表中增加一个新的约束。 OWNER 把该表的所有者改为用户 new user.
如果要改变表的纲要,你必须是表的所有者.
COLUMN 关键字是多余的,可以省略.
在目前的实现里,新列/字段的缺省(值)和约束子句会被忽略。你可以随后用 ALTER TABLE 的 SET DEFAULT 形式设置缺省(值)。(你还不得不用 UPDATE把已存在行更新为缺省值。)
在目前的实现里,只有 FOREIGN KEY 约束可以增加到表中. 要创建或者删除一个唯一约束,可以创建一个唯一索引(参阅 CREATE INDEX) .要想增加 check (检查)约束,你需要重建和重载该表,用的参数是 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
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 的扩展。SQL92 没有提供这些。