当前位置:  开发笔记 > 数据库 > 正文

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

如何解决《如何将列添加到不允许空值的Postgresql数据库?》经验,为你挑选了4个好方法。

我正在使用以下查询(为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时收到了同样的错误.



1> Luc M..:

您必须设置默认值.

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;


@SeanBright,您可以通过`man ALTER_TABLE` :)离线访问postgres doc
如果要使用其他列计算现有行的初始值,则无效.[j_random_hacker的回答](http://stackoverflow.com/a/516016/1394393)允许这样做,使其更加健壮.

2> j_random_hac..:

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


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

3> Sean Bright..:

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


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

4> Paul Tomblin..:

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

推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有