New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Добавление новой колонки NOT NULL #12
Comments
Скрипт для воспроизведения: create table checksync_tables as
select generate_series(1, 5) as id;
ALTER TABLE checksync_tables
ADD COLUMN job_number smallint;
ALTER TABLE ONLY checksync_tables
ALTER COLUMN job_number SET DEFAULT 0;
ALTER TABLE ONLY checksync_tables
ALTER COLUMN job_number SET NOT NULL; |
Я помню, мы этот кейс обсуждали в своё время и пришли к выводу, что текущее поведение (т.е. когда дефолтные значения выставляются только для новых записей) наиболее приемлемо для существующих данных. Нужно подумать об опции для изменения поведения. |
Разъединение такой команды на части хорошо в случае когда мы хотим добавить поле с DEFAULT значением но не NOT NULL. ALTER TABLE ONLY checksync_tables |
Да, именно кейс без NOT NULL рассматривался, когда мы меняли это поведение (задача 3755 во внутреннем трекере). Для NOT NULL видится опциональное добавление команды наподобие: UPDATE t_table SET c_column = DEFAULT WHERE c_column IS NULL; перед выставлением NOT NULL. |
@Endeavourl А почему определение дефолта не перенести в стейтмент создания колонки? |
Согласен с @Endeavourl |
Ок, можно и так. |
@asaushkin |
исправлено в a4675b3 |
Спасибо! |
добавил в таблицу новую колонку:
job_number smallint DEFAULT 0 NOT NULL
сгенерировался код:
ALTER TABLE checksync_tables
ADD COLUMN job_number smallint;
ALTER TABLE ONLY checksync_tables
ALTER COLUMN job_number SET DEFAULT 0;
ALTER TABLE ONLY checksync_tables
ALTER COLUMN job_number SET NOT NULL;
—
к сожалению этот код просто так выполнить невозможно.
1-я строка добавит NULL поле
2-я строка объявит что для insert/update надо заполнить поле значением null
3-я строка попытается сделать поле NOT NULL но конечно у неё это не получится, так как в таблице все строки на данный момент есть NULL
для данной операции ожидалась команда
ALTER TABLE checksync_tables
ADD COLUMN job_number smallint NOT NULL DEFAULT 0;
—
ваш вариант генерации кода я использую в своих PRE скриптах, когда нужно в цикле мелкими пакетами обработать большую таблицу. Но это ручная работа и такой скрипт пишется специально и вручную. В этом случаем между 2-й и 3-й строкой стоит код замены всех строк с NULL на DEFAULT значение.
The text was updated successfully, but these errors were encountered: