我正在使用以下查询(针对 Internet 进行清理)向我的 Postgresql 数据库添加一个新的“NOT NULL”列:
ALTER TABLE mytable ADD COLUMN mycolumn character varying(50) NOT NULL;
每次运行此查询时,我都会收到以下错误消息:
错误:列“mycolumn”包含空值
我难住了。我哪里错了?
注意:我主要使用 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 所说的去做,然后在没有空约束的情况下添加它,直到您在现有行上填充它。
此查询将自动更新空值
ALTER TABLE mytable ADD COLUMN mycolumn character varying(50) DEFAULT 'whatever' NOT NULL;
假设默认值合适,指定默认值也可以。
或者,使用额外的列创建一个新表作为临时表,将数据复制到这个新表中,同时根据需要对其进行操作以填充不可为空的新列,然后通过两步更改名称来交换表。
是的,它更复杂,但如果您不想在活动表上进行大更新,您可能需要这样做。
这对我有用::)
ALTER TABLE your_table_name ADD COLUMN new_column_name int;
NOT NULL
约束。当然,它正在工作。
man ALTER_TABLE
离线访问 postgres 文档 :)