我正在使用以下查询(为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时收到了同样的错误.
您必须设置默认值.
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
语句尝试插入NULL
到新创建的列中以用于所有现有行.您必须将列添加为允许NULL
,然后使用所需的值填充列,然后将其设置为NOT NULL
之后.
您需要定义一个默认值,或者执行Sean所说的内容并在没有空约束的情况下添加它,直到您将其填入现有行.