Ответ 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;
Я добавляю новый столбец "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.
Вы должны установить значение по умолчанию.
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;
Поскольку строки уже существуют в таблице, оператор ALTER
пытается вставить NULL
во вновь созданный столбец для всех существующих строк. Вам нужно будет добавить столбец как разрешающий NULL
, а затем заполнить столбец необходимыми значениями и затем установить его на NOT NULL
.
Как наблюдали другие, вы должны либо создать столбец с нулевым значением, либо указать значение 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;
Вам нужно либо определить значение по умолчанию, либо сделать то, что говорит Шон, и добавить его без нулевого ограничения, пока вы не заполнили его в существующих строках.
Указание значения по умолчанию также будет работать, если предположить, что значение по умолчанию подходит.
Или создайте новую таблицу как temp с дополнительным столбцом, скопируйте данные в эту новую таблицу, при необходимости обработайте ее, чтобы заполнить новый столбец с нулевым значением, а затем поменяйте таблицу с помощью двухэтапного изменения имени.
Да, это сложнее, но вам может понадобиться сделать это таким образом, если вы не хотите иметь большой UPDATE на живой таблице.
этот запрос будет автоматически обновлять нули
ALTER TABLE mytable ADD COLUMN mycolumn character varying(50) DEFAULT 'whatever' NOT NULL;
Это сработало для меня::)
ALTER TABLE your_table_name ADD COLUMN new_column_name int;