ALTER TABLE
ALTER TABLE — 修改表属性
大纲
ALTER TABLEtable[ * ] ADD [ COLUMN ]columntypeALTER TABLEtable[ * ] ALTER [ COLUMN ]column{ SET DEFAULTvalue| DROP DEFAULT } ALTER TABLEtable[ * ] RENAME [ COLUMN ]columnTOnewcolumnALTER TABLEtableRENAME TOnewtableALTER TABLEtableADDtable constraint definition
输入
table要更改的现有表的名称。
column新列或现有列的名称。
type新列的类型。
newcolumn现有列的新名称。
newtable表的新名称。
table constraint definition表的新表约束
输出
ALTER列或表重命名后返回的消息。
ERROR表或列不可用时返回的消息。
描述
ALTER TABLE 更改一个现有表的定义。ADD COLUMN 形式使用与 CREATE TABLE
相同的语法向表添加一个新列。ALTER COLUMN 形式允许你为列设置或移除默认值。注意,默认值只会应用于新插入的行。RENAME 子句更改表或列的名称,而不更改受影响表中包含的任何数据。因此,该命令执行后,表或列仍保持相同的类型和大小。ADD table constraint definition 子句使用与 CREATE TABLE
相同的语法向表增加一个新约束。
要更改表的模式,你必须拥有该表。
注意
关键字COLUMN只是噪声,可以省略。
“*” 跟在表名之后表示该语句应作用于该表以及继承层次中位于其下的所有表;默认情况下,属性不会被添加到任何子类中,也不会在任何子类中被重命名。在超类中添加或修改属性时应始终这样做。如果不这样做,对继承层次的查询(例如
SELECTNewColumnFROMSuperClass*
将无法工作,因为子类会缺少超类中已有的属性。
在当前实现中,新列的默认值和约束子句会被忽略。可以在之后使用
ALTER TABLE 的 SET DEFAULT
形式设置默认值。(你还必须用 UPDATE
把已有的行更新为新默认值。)
在当前实现中,只能向表添加 FOREIGN KEY 约束。要创建或移除唯一约束,请创建唯一索引(见 CREATE INDEX )。要添加检查约束,你需要用 CREATE TABLE 命令的其他参数重建并重新装载该表。
要更改类(class)的模式,你必须拥有它。不允许重命名系统目录模式的任何部分。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
兼容性
SQL92
ADD COLUMN 形式符合标准,但不支持默认值和约束,如上所述。ALTER COLUMN 形式完全符合标准。
SQL92 为 ALTER TABLE
语句规定了一些 Postgres
尚不直接支持的附加能力:
-
ALTER TABLE
tableDROP CONSTRAINTconstraint{ 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
tableDROP [ 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 的扩展。