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

我使用下面的查询(对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),但是当我从terminal内运行SQL时收到了同样的错误。

你必须设置一个默认值。

 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; 

由于表中已经存在行,因此ALTER语句试图将NULL插入到所有现有行的新创build列中。 您将不得不将该列添加为允许NULL ,然后用所需的值填充该列,然后将其设置为NOT NULL

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

你可能需要定义一个默认值,或者做一下Sean所说的,并在没有null约束的情况下添加它,直到你在现有的行上填充它为止。

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

或者,用额外的列创build一个新表作为临时表,将数据复制到这个新表中,并根据需要操作它以填充不可为空的新列,然后通过两步更改名称来交换表。

是的,这是更复杂的,但是如果你不想在一张真正的桌子上进行大的更新,你可能需要这样做。

这个查询将自动更新空值

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

这对我工作:)

 ALTER TABLE your_table_name ADD COLUMN new_column_name int;