如何在 Postgresql 数据库中添加不允许为空的列?

问题描述 投票:0回答:9

我使用以下查询向我的 Postgresql 数据库添加一个新的“NOT NULL”列(针对 Internet 进行了清理):

ALTER TABLE mytable ADD COLUMN mycolumn character varying(50) NOT NULL;

每次运行此查询时,我都会收到以下错误消息:

ERROR:  column "mycolumn" contains null values

我被难住了。 我哪里错了?

注意:我主要使用 pgAdmin III (1.8.4),但是当我从终端内运行 SQL 时,我收到了相同的错误。

sql postgresql alter-table
9个回答
549
投票

您必须设置一个默认值。

ALTER TABLE mytable ADD COLUMN mycolumn character varying(50) NOT NULL DEFAULT 'foo';

... some work (set real values as you want)...

ALTER TABLE mytable ALTER COLUMN mycolumn DROP DEFAULT;

134
投票

正如其他人所观察到的,您必须创建一个可为空的列或提供一个 DEFAULT 值。 如果这不够灵活(例如,如果您需要以某种方式单独计算每一行的新值),您可以使用以下事实:在 PostgreSQL 中,所有 DDL 命令都可以在事务内执行:

BEGIN;
ALTER TABLE mytable ADD COLUMN mycolumn character varying(50);
UPDATE mytable SET mycolumn = timeofday();    -- Just a silly example
ALTER TABLE mytable ALTER COLUMN mycolumn SET NOT NULL;
COMMIT;

56
投票

由于表中已存在行,因此

ALTER
语句尝试将
NULL
插入到所有现有行的新创建列中。 您必须添加允许
NULL
的列,然后用所需的值填充该列,然后将其设置为
NOT NULL


8
投票

此查询将自动更新空值

ALTER TABLE mytable ADD COLUMN mycolumn character varying(50) DEFAULT 'whatever' NOT NULL;

6
投票

您要么需要定义一个默认值,要么按照 Sean 所说的操作并在没有空约束的情况下添加它,直到您将其填充到现有行上为止。


3
投票

假设默认值合适,指定默认值也是可行的。


0
投票

您可以创建新列并使用

USING
子句计算现有列的值:

ALTER TABLE table_name 
ADD COLUMN new_column data_type NOT NULL 
USING (expression);

-1
投票

或者,使用额外列创建一个新表作为 temp,将数据复制到这个新表,同时根据需要对其进行操作以填充不可为空的新列,然后通过两步名称更改来交换该表。

是的,它更复杂,但是如果您不想在实时表上进行大的更新,您可能需要这样做。


-21
投票

这对我有用::)

ALTER TABLE your_table_name ADD COLUMN new_column_name int;
© www.soinside.com 2019 - 2024. All rights reserved.