Answers:
您必须设置一个默认值。
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;
man ALTER_TABLE
:)
正如其他人观察到的那样,您必须创建可为空的列或提供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;
或者,使用额外的列将新表创建为temp,将数据复制到该新表中,同时根据需要对其进行操作以填充不可为空的新列,然后通过两步更改名称来交换该表。
是的,它更复杂,但是如果您不希望对活动表进行大的更新,则可能需要这样做。