Как добавить столбец в базу данных Postgresql, которая не допускает нулей?

Я добавляю новый столбец "NOT NULL" в свою базу данных Postgresql, используя следующий запрос (санированный для Интернета):

ALTER TABLE mytable ADD COLUMN mycolumn character varying(50) NOT NULL;

каждый раз, когда я запускаю этот запрос, я получаю следующее сообщение об ошибке:

ERROR:  column "mycolumn" contains null values

Я в тупике. Где я ошибаюсь?

примечание: Я использую pgAdmin III (1.8.4) в первую очередь, но я получил ту же ошибку, когда я запускал SQL из терминала.

8 ответов


вы должны установить значение по умолчанию.

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;

как отмечали другие, необходимо либо создать столбец с нулевым значением, либо указать значение по умолчанию. Если это недостаточно гибко (например, если вам нужно каким-то образом вычислить новое значение для каждой строки), вы можете использовать тот факт, что в 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 во вновь созданный столбец для всех существующих строк. Вам нужно будет добавить столбец как allowing NULL, затем заполните столбец нужными значениями, А затем установите его в NOT NULL потом.


вам либо нужно определить значение по умолчанию, либо сделать то, что говорит Шон, и добавить его без ограничения null, пока вы не заполнили его в существующих строках.


указание значения по умолчанию также будет работать, предполагая, что значение по умолчанию является подходящим.


или создайте новую таблицу как temp с дополнительным столбцом, скопируйте данные в эту новую таблицу, манипулируя ею по мере необходимости, чтобы заполнить новый столбец, не имеющий значения NULL, а затем замените таблицу с помощью двухэтапного изменения имени.

Да, это сложнее, но вам может потребоваться сделать это таким образом, если вы не хотите большого обновления на живой таблице.


этот запрос автоматически обновит нули

ALTER TABLE mytable ADD COLUMN mycolumn character varying(50) DEFAULT 'whatever' NOT NULL;

это сработало для меня::)

ALTER TABLE your_table_name ADD COLUMN new_column_name int;