如何改变PostgreSQL表并添加一个列

484 阅读3分钟

在创建数据库并为其填充信息后,你很少需要改变数据库结构。你要做的经常性工作是添加或检索存储在数据库中的记录。然而,在一些罕见的情况下,你可能需要添加一个新的列,并为其填充数据。

在本指南中,我们将看看如何改变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查询,允许你向现有的表添加列。