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

How can I add a column to a Postgresql database that doesn't allow nulls?

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

1
ALTER TABLE mytable ADD COLUMN mycolumn CHARACTER VARYING(50) NOT NULL;

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

1
ERROR:  COLUMN"mycolumn" contains NULL VALUES

我很难过。 我哪里错了?

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


您必须设置默认值。

1
2
3
4
5
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;


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

1
2
3
4
5
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;


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


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


假设默认值合适,指定默认值也会起作用。


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

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


此查询将自动更新空值

1
ALTER TABLE mytable ADD COLUMN mycolumn CHARACTER VARYING(50) DEFAULT 'whatever' NOT NULL;

这对我有用::)

1
ALTER TABLE your_table_name ADD COLUMN new_column_name INT;