【PostgreSQL】从零开始:(四十三)修改表

2024-01-02 06:00:31

添加列

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;

文章来源:https://blog.csdn.net/sinat_36528886/article/details/135330894
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。