当您创建一个表并意识到您犯了一个错误,或者应用程序的需求发生变化时,您可以删除该表并重新创建它。但是,如果表已经被数据填充,或者表被其他数据库对象引用(例如外键约束),这不是一个方便的选择。因此 PostgreSQL 提供了一系列命令来修改现有的表。请注意,这在概念上与更改表中包含的数据不同:这里我们感兴趣的是更改表的定义或结构。
一、新增一列
要添加列,请使用如下命令:
ALTER TABLE products ADD COLUMN description text;
新列最初填充了给定的任何默认值(如果未指定 DEFAULT 子句,则为 null)。
您还可以使用通常的语法同时在列上定义约束:
ALTER TABLE products ADD COLUMN description text CHECK (description <> '');
二、删除列
要删除列,请使用如下命令:
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;
要添加非空约束,请使用以下语法:
ALTER TABLE products ALTER COLUMN product_no SET NOT NULL;
约束会被立即检查,所以表数据必须满足约束才能添加。
四、移除约束
要删除约束,您需要知道它的名称。如果你给它一个名字,那很容易。否则系统会分配一个生成的名称,您需要找出它。psql 命令 \d tablename 在这里会有所帮助;其他接口也可能提供一种检查表详细信息的方法。然后命令是:
ALTER TABLE products DROP CONSTRAINT some_name;
与删除列一样,如果要删除其他依赖项的约束,则需要添加 CASCADE。例如,外键约束依赖于引用列上的唯一键或主键约束。
要删除非空约束,请使用:
ALTER TABLE products ALTER COLUMN product_no DROP NOT NULL;
非空约束没有名称。
五、设置默认值
要为列设置新的默认值,请使用如下命令:
ALTER TABLE products ALTER COLUMN price SET DEFAULT 7.77;
请注意,这不会影响表中的任何现有行,它只会更改未来 INSERT 命令的默认值。
要删除任何默认值,请使用:
ALTER TABLE products ALTER COLUMN price DROP DEFAULT;
六、改变列数据类型
要将列转换为不同的数据类型,请使用如下命令:
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;