问答中心分类: SQL如何在 Postgresql 数据库中添加不允许空值的列?
0
匿名用户 提问 18小时 前

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

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

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

ERROR:  column "mycolumn" contains null values

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

6 Answers
0
j_random_hacker 回答 18小时 前

正如其他人所观察到的,您必须创建一个可为空的列或提供一个 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;
Beni Cherniavsky-Paskin 回复 18小时 前

即使在事务中,NOT NULL 也会立即强制执行,因此必须首先添加列,填充值,然后添加 NOT NULL——就像这个答案一样。 (在 postgres 9.6 上测试)

0
Sean Bright 回答 18小时 前

由于表中已经存在行,因此ALTER语句正在尝试插入NULL到所有现有行的新创建列中。您必须将列添加为允许NULL,然后用您想要的值填充该列,然后将其设置为NOT NULL然后。

Victor Farazdagi 回复 18小时 前

如何做到这一点的例子会非常好。否则,Luc 的解决方案似乎更完整并且可以使用。

0
Paul Tomblin 回答 18小时 前

您要么需要定义一个默认值,要么按照 Sean 所说的去做,然后在没有空约束的情况下添加它,直到您在现有行上填充它。

0
jacktrade 回答 18小时 前

此查询将自动更新空值

ALTER TABLE mytable ADD COLUMN mycolumn character varying(50) DEFAULT 'whatever' NOT NULL;
0
Ryan Graham 回答 18小时 前

假设默认值合适,指定默认值也可以。

hardmath 回复 18小时 前

给出修改后的语法以创建具有默认值的列(用于说明)将改进答案。