How can I add a column to a Postgresql database that doesn't allow nulls?
我正在使用以下查询(为Internet清理)向Postgresql数据库添加一个新的"NOT NULL"列:
1 | ALTER TABLE mytable ADD COLUMN mycolumn CHARACTER VARYING(50) NOT NULL; |
每次运行此查询时,都会收到以下错误消息:
1 ERROR: COLUMN"mycolumn" contains NULL VALUES
我很难过。 我哪里错了?
注意:我主要使用pgAdmin III(1.8.4),但是当我从终端内运行SQL时收到了同样的错误。
您必须设置默认值。
1 2 3 4 5 | 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命令都可以在事务中执行:
1 2 3 4 5 | 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; |
由于表中已存在行,因此
您需要定义一个默认值,或者执行Sean所说的内容并在没有空约束的情况下添加它,直到您将其填入现有行。
假设默认值合适,指定默认值也会起作用。
或者,使用额外列创建一个新表作为temp,将数据复制到此新表,同时根据需要操作它以填充不可为空的新列,然后通过两步名称更改交换表。
是的,它更复杂,但是如果你不想在实时表上进行大的UPDATE,你可能需要这样做。
此查询将自动更新空值
1 | ALTER TABLE mytable ADD COLUMN mycolumn CHARACTER VARYING(50) DEFAULT 'whatever' NOT NULL; |
这对我有用::)
1 | ALTER TABLE your_table_name ADD COLUMN new_column_name INT; |