Как добавить столбец в базу данных Postgresql, который не допускает нулевые значения? - PullRequest
218 голосов
/ 04 февраля 2009

Я добавляю новый столбец «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 ]

358 голосов
/ 04 февраля 2009

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

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;
70 голосов
/ 05 февраля 2009

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

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

5 голосов
/ 04 февраля 2009

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

2 голосов
/ 04 февраля 2009

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

1 голос
/ 04 февраля 2009

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

Да, это сложнее, но вам может потребоваться сделать это таким образом, если вы не хотите большого ОБНОВЛЕНИЯ на живом столе.

0 голосов
/ 09 февраля 2017

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

ALTER TABLE your_table_name ADD COLUMN new_column_name int;
0 голосов
/ 12 июня 2013

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

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