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

Я добавляю новый столбец "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 из Terminal.

Ответ 1

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

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;

Ответ 2

Поскольку строки уже существуют в таблице, оператор ALTER пытается вставить NULL во вновь созданный столбец для всех существующих строк. Вам нужно будет добавить столбец как разрешающий NULL, а затем заполнить столбец необходимыми значениями и затем установить его на NOT NULL.

Ответ 3

Как наблюдали другие, вы должны либо создать столбец с нулевым значением, либо указать значение 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;

Ответ 4

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

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

Ответ 8

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

ALTER TABLE your_table_name ADD COLUMN new_column_name int;