Huu*_*uze 230 sql postgresql alter-table
我正在使用以下查询(为Internet清理)向Postgresql数据库添加一个新的"NOT NULL"列:
ALTER TABLE mytable ADD COLUMN mycolumn character varying(50) NOT NULL;
Run Code Online (Sandbox Code Playgroud)
每次运行此查询时,都会收到以下错误消息:
Run Code Online (Sandbox Code Playgroud)ERROR: column "mycolumn" contains null values
我很难过.我哪里错了?
注意:我主要使用pgAdmin III(1.8.4),但是当我从终端内运行SQL时收到了同样的错误.
Luc*_*c M 373
您必须设置默认值.
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;
Run Code Online (Sandbox Code Playgroud)
j_r*_*ker 74
正如其他人所观察到的那样,您必须创建一个可为空的列或提供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;
Run Code Online (Sandbox Code Playgroud)
Sea*_*ght 48
由于表中已存在行,因此该ALTER语句尝试插入NULL到新创建的列中以用于所有现有行.您必须将列添加为允许NULL,然后使用所需的值填充列,然后将其设置为NOT NULL之后.
该查询将自动更新空值
ALTER TABLE mytable ADD COLUMN mycolumn character varying(50) DEFAULT 'whatever' NOT NULL;
Run Code Online (Sandbox Code Playgroud)