在创建数据库并为其填充信息后,你很少需要改变数据库结构。你要做的经常性工作是添加或检索存储在数据库中的记录。然而,在一些罕见的情况下,你可能需要添加一个新的列,并为其填充数据。
在本指南中,我们将看看如何改变PostgreSQL表并添加一个列。
基本用法
要在一个表中增加一个列,我们首先需要指定 "改变查询",然后是表名。
我们可以将添加列的一般语法表述为:
ALTER TABLE table_name ADD COLUMN IF NOT EXISTS column_name DATA_TYPE
在上面的语法中,我们首先调用ALTER TABLE查询,然后是我们要添加列的表的名称。接下来,在ADD COLUMN语句后指定列名。
虽然IF NOT EXISTS语句是可选的,但是如果有类似名称的列存在,它可以成为一种避免错误的有用方法。
最后,我们指定列的数据类型和列的约束。
你也可以通过一个接一个地指定它们的名称、数据类型和约束条件(用逗号分隔)来添加多个列。
注意:PostgreSQL将任何新列添加到表的末尾,因为它没有指定列的位置的方法。因此,要在一个PostgreSQL表中创建一个新的列布局,你必须重新创建一个新的表或使用一个视图。
例子
让我们为sakila数据库中的city表添加一个列。
ALTER TABLE city ADD COLUMN city_code VARCHAR(20);
上面的查询将列city_code添加到city表中。你可以通过使用选择语句来验证。
SELECT * from city LIMIT 5;
如下面的截图所示,上述查询应该返回city表中带有新列的记录。

要同时添加多个列,可以在一个列表中指定列的值,如。
ALTER TABLE city
ADD COLUMN IF NOT EXISTS population SERIAL NOT NULL,
ADD COLUMN IF NOT EXISTS streets VARCHAR(255),
ADD COLUMN other INT;
上面的查询应该按照指定的顺序添加三个列。将列追加到表中的顺序是指定的。
例如,在上面的查询中,人口列将出现在街道之前。

在前面的例子中,所有添加的列都包含NULL值。为了指定一个占位值,我们可以使用DEFAULT关键字。
考虑一下城市代码列。让我们从删除该列开始。
ALTER TABLE city DROP COLUMN city_code;
接下来,用ADD COLUMN关键字追加该列;默认值在下面的查询中。
注意:city_code列将在表的最后。
ALTERTABLE city ADDCOLUMNcity_codeVARCHAR(20) DEFAULT 'AA';

在上面的例子中,PostgreSQL将使用指定的默认值来填充city_code列的值。
当列有NOT NULL约束时,使用指定的缺省值会很有用。
添加一个列可以采用任何支持的PostgreSQL数据类型。例如,下面包含一个布尔值的列。
ALTER TABLE city ADD COLUMN IF NOT EXISTS is_active BOOLEAN NOT NULL DEFAULT true;

注意:由于PostgreSQL会在没有指定默认值的情况下给一个列添加NULL值,所以最好添加一个默认值。如果没有,PostgreSQL会返回一个错误!
例如,我们可以这样创建一个表。
ALTER TABLE city DROP COLUMN no_null
ALTER TABLE city ADD COLUMN IF NOT EXISTS no_null BOOLEAN NOT NULL;
在这种情况下,我们会得到一个SQL状态23502。
ERROR: column "no_null" of relation "city" contains null values
SQL state: 23502
SQL状态23502表示操作(UPDATE, SET OR INSERT是NULL,但对象不接受NULL值)。
总结
本教程指导你如何在PostgreSQL中使用和操作ADD COLUMN查询,允许你向现有的表添加列。