我添加了一个新的,“NOT NULL”列到我的Postgresql数据库使用以下查询(为互联网消毒):
ALTER TABLE mytable ADD COLUMN mycolumn character varying(50) NOT NULL;
每次我运行这个查询,我都会收到以下错误消息:
错误:字段“mycolumn”包含空值
我难住了。我哪里说错了?
注意:我主要使用pgAdmin III(1.8.4),但当我在终端内运行SQL时,我收到了相同的错误。
我添加了一个新的,“NOT NULL”列到我的Postgresql数据库使用以下查询(为互联网消毒):
ALTER TABLE mytable ADD COLUMN mycolumn character varying(50) NOT NULL;
每次我运行这个查询,我都会收到以下错误消息:
错误:字段“mycolumn”包含空值
我难住了。我哪里说错了?
注意:我主要使用pgAdmin III(1.8.4),但当我在终端内运行SQL时,我收到了相同的错误。
由于表中已经存在行,ALTER语句试图将NULL插入到新创建的所有现有行的列中。您必须将该列添加为允许NULL,然后用您想要的值填充该列,然后将其设置为NOT NULL。
或者,创建一个带有额外列的临时表,将数据复制到这个新表,同时根据需要对其进行操作,以填充不可为空的新列,然后通过两步更改名称来交换表。
是的,它更复杂,但如果您不想在活动表上进行大的UPDATE,则可能需要这样做。
您必须设置一个默认值。
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命令都可以在事务中执行:
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 TABLE mytable ADD COLUMN mycolumn character varying(50) DEFAULT 'whatever' NOT NULL;