ALTER TABLE products ADD COLUMN description text;
新列最初填充给定的任何默认值DEFAULT(如果未指定子句,则为 null)。
注意:
从 PostgreSQL 11 开始,添加ALTER TABLE具有常量默认值的列不再意味着在执行语句时需要更新表的每一行。相反,默认值将在下次访问该行时返回,并在重写表时应用,即使在大型表上也非常快。
但是,如果默认值是可变的(例如clock_timestamp()),ALTER TABLE则需要使用执行时计算的值更新每一行。为了避免可能冗长的更新操作,特别是如果您打算用大部分非默认值填充该列,最好添加没有默认值的列,使用UPDATE插入正确的值,然后添加任何所需的默认值,如下所述。
您还可以使用常用语法同时定义对列的约束:
ALTER TABLE products ADD COLUMN description text CHECK (description <> '');
事实上,所有可以应用于列描述的选项都可以在这里使用。但请记住,默认值必须满足给定的约束,否则将失败。CREATE TABLE或者ADD,您可以在正确填写新列后稍后添加约束(见下文)。
若要删除列,请使用如下命令:
ALTER TABLE products DROP COLUMN description;
列中的任何数据都会消失。涉及该列的表约束也会被删除。但是,如果该列被另一个表的外键约束引用,则 PostgreSQL 不会以静默方式删除该约束。您可以通过添加CASCADE来授权删除依赖于该列的所有内容:
ALTER TABLE products DROP COLUMN description CASCADE;
若要添加约束,请使用表约束语法。例如:
ALTER TABLE products ADD CHECK (name <> '');
ALTER TABLE products ADD CONSTRAINT some_name UNIQUE (product_no);
ALTER TABLE products ADD FOREIGN KEY (product_group_id) REFERENCES product_groups;
若要添加不能写为表约束的非 null 约束,请使用以下语法:
ALTER TABLE products ALTER COLUMN product_no SET NOT NULL;
将立即检查约束条件,因此表数据必须满足约束条件才能添加。
要删除约束,您需要知道其名称。如果你给它起个名字,那就很容易了。否则,系统会分配一个生成的名称,您需要找出该名称。psql 命令在这里可能会有所帮助;其他接口也可能提供检查表详细信息的方法。那么命令是:
\d tablename
ALTER TABLE products DROP CONSTRAINT some_name;
如果您正在处理生成的约束名称,例如$2 ,请不要忘记需要用双引号将其用作有效的标识符。
与删除列一样,如果要删除其他内容所依赖的约束,则需要添加。例如CASCADE,外键约束依赖于引用列的唯一键或主键约束。
这适用于除非 null 约束之外的所有约束类型。若要删除 not null 约束,请使用:
ALTER TABLE products ALTER COLUMN product_no DROP NOT NULL;
回想一下,非 null 约束没有名称。
若要为列设置新的默认值,请使用如下命令:
ALTER TABLE products ALTER COLUMN price SET DEFAULT 7.77;
请注意,这不会影响表中的任何现有行,它只是更改了未来命令INSERT的默认值。
若要删除任何默认值,请使用:
ALTER TABLE products ALTER COLUMN price DROP DEFAULT;
这实际上与将默认值设置为 null 相同。因此,在未定义默认值的地方删除默认值不会出错,因为默认值隐式为 null 值。
若要将列转换为其他数据类型,请使用如下命令:
ALTER TABLE products ALTER COLUMN price TYPE numeric(10,2);
仅当列中的每个现有条目都可以通过隐式强制转换转换为新类型时,此操作才会成功。如果需要更复杂的转换,可以添加一个子句USING,指定如何从旧值计算新值。
PostgreSQL 将尝试将列的默认值(如果有)转换为新类型,以及涉及该列的任何约束。但这些转换可能会失败,或者可能会产生令人惊讶的结果。通常最好在更改列类型之前删除列上的任何约束,然后再添加回经过适当修改的约束。
要重命名列:
ALTER TABLE products RENAME COLUMN product_no TO product_number;
要重命名表:
ALTER TABLE products RENAME TO items;