ALTER TABLE
ALTER TABLE — 更改一个表的定义
大纲
ALTER TABLE [ ONLY ]table[ * ] ADD [ COLUMN ]columntype[column_constraint[ ... ] ] ALTER TABLE [ ONLY ]table[ * ] ALTER [ COLUMN ]column{ SET DEFAULTvalue| DROP DEFAULT } ALTER TABLE [ ONLY ]table[ * ] ALTER [ COLUMN ]columnSET STATISTICSintegerALTER TABLE [ ONLY ]table[ * ] RENAME [ COLUMN ]columnTOnewcolumnALTER TABLEtableRENAME TOnew_tableALTER TABLEtableADDtable_constraint_definitionALTER TABLE [ ONLY ]tableDROP CONSTRAINTconstraint{ RESTRICT | CASCADE } ALTER TABLEtableOWNER TOnew_owner
输入
table要更改的现有表的名称。
column新列或现有列的名称。
type新列的类型。
newcolumn现有列的新名称。
new_table表的新名称。
table_constraint_definition表的新表约束
new_owner表的新所有者的用户名。
输出
ALTER列或表重命名后返回的消息。
ERROR表或列不可用时返回的消息。
描述
ALTER TABLE 更改一个现有表的定义。ADD COLUMN 形式使用与CREATE TABLE相同的语法向表添加一个新列。ALTER COLUMN SET/DROP DEFAULT 形式允许你为列设置或移除默认值。注意,默认值只会应用于后续的
INSERT 命令;它们不会导致表中已有的行发生变化。ALTER COLUMN SET STATISTICS 形式允许你为后续 ANALYZE
操作设置统计信息收集目标。RENAME 子句更改表、列、索引或序列的名称,而不更改任何数据。命令执行后,数据仍保持相同的类型和大小。ADD table_constraint_definition 子句使用与CREATE TABLE相同的语法向表增加一个新约束。DROP CONSTRAINT constraint 子句删除表(及其子表)上所有与
constraint 匹配的约束。OWNER 子句把表的所有者更改为用户
new user。
要更改表的模式,你必须拥有该表。
注意
关键字COLUMN只是噪声,可以省略。
在当前 ADD COLUMN 的实现中,不支持新列的默认值和
NOT NULL 子句。可以在之后使用
ALTER TABLE 的 SET DEFAULT
形式设置默认值。(你可能还想用UPDATE把已有的行更新为新默认值。)
在 DROP CONSTRAINT 中,RESTRICT 关键字是必需的,但尚未检查依赖关系。CASCADE 选项不受支持。目前 DROP CONSTRAINT 只删除 CHECK 约束。要移除 PRIMARY 或 UNIQUE 约束,请用 DROP INDEX 命令删除相关的索引。要移除 FOREIGN KEY 约束,你需要用CREATE TABLE命令的其他参数重建并重新装载该表。
例如,要删除表 distributors 上的所有约束:
CREATE TABLE temp AS SELECT * FROM distributors;
DROP TABLE distributors;
CREATE TABLE distributors AS SELECT * FROM temp;
DROP TABLE temp;
要更改表,你必须拥有它。不允许更改系统目录模式的任何部分。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 zipchk CHECK (char_length(zipcode) = 5);
要从一个表及其所有后代移除一个检查约束:
ALTER TABLE distributors DROP CONSTRAINT zipchk RESTRICT;
为一个表增加一个外键约束:
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);
兼容性
SQL92
ADD COLUMN 形式符合标准,但不支持默认值和
NOT NULL 约束,如上所述。ALTER
COLUMN 形式完全符合标准。
SQL92 为 ALTER TABLE
语句规定了一些 PostgreSQL
尚不直接支持的附加能力:
-
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;
重命名表、列、索引和序列的子句是 PostgreSQL 对 SQL92 的扩展。