Как я могу добавить столбец в базу данных 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 из терминала.

582   8  

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

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

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

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

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

этот запрос автоматически обновит значения 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;

Comments

    Ничего не найдено.