如何将列添加到不允许空值的Postgresql数据库?

Huu*_*uze 230 sql postgresql alter-table

我正在使用以下查询(为Internet清理)向Postgresql数据库添加一个新的"NOT NULL"列:

ALTER TABLE mytable ADD COLUMN mycolumn character varying(50) NOT NULL;
Run Code Online (Sandbox Code Playgroud)

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

ERROR:  column "mycolumn" contains null values
Run Code Online (Sandbox Code Playgroud)

我很难过.我哪里错了?

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

Luc*_*c M 373

您必须设置默认值.

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;
Run Code Online (Sandbox Code Playgroud)

  • @SeanBright,您可以通过`man ALTER_TABLE` :)离线访问postgres doc (4认同)
  • 澄清:默认值只需要更新现有行,这就是为什么之后可以立即删除它。更改表时,所有现有行都已更新(显然,这可能需要一些时间) (2认同)
  • 如果要使用其他列计算现有行的初始值,则无效.[j_random_hacker的回答](http://stackoverflow.com/a/516016/1394393)允许这样做,使其更加健壮. (2认同)

j_r*_*ker 74

正如其他人所观察到的那样,您必须创建一个可为空的列或提供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;
Run Code Online (Sandbox Code Playgroud)

  • 即使在事务中,也会立即强制执行NOT NULL,因此必须首先添加列,填充值,然后添加NOT NULL - 正如此答案所做的那样.(在postgres 9.6上测试) (6认同)

Sea*_*ght 48

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

  • 如何做到这一点的例子真的很棒.否则,Luc的解决方案似乎更完整,随时可以使用. (7认同)

jac*_*ade 7

该查询将自动更新空值

ALTER TABLE mytable ADD COLUMN mycolumn character varying(50) DEFAULT 'whatever' NOT NULL;
Run Code Online (Sandbox Code Playgroud)


Pau*_*lin 5

您需要定义一个默认值,或者执行Sean所说的内容并在没有空约束的情况下添加它,直到您将其填入现有行.