Ответ 1
Вы можете изменить поле и сделать его не равным null без проверки полей. Если вы действительно обеспокоены тем, что вы не делаете это за несколько часов, вы можете добавить ограничение в поле, которое проверяет, чтобы убедиться, что оно не равно нулю. Это позволит вам использовать параметр "Без проверки" и не проверять каждый из 4 миллионов строк, чтобы узнать, обновляется ли он.
CREATE TABLE Test
(
T0 INT Not NULL,
T1 INT NUll
)
INSERT INTO Test VALUES(1, NULL) -- Works!
ALTER TABLE Test
WITH NOCHECK
ADD CONSTRAINT N_null_test CHECK (T1 IS NOT NULL)
ALTER COLUMN T1 int NOT NULL
INSERT INTO Test VALUES(1, NULL) -- Doesn't work now!
Действительно, у вас есть два варианта (добавлено третье, см. править):
- Используйте ограничение, которое предотвратит обновление любых новых строк и оставит исходные неизменными.
- Обновите строки, которые являются нулями для чего-то другого, а затем примените опцию null null. Это действительно должно выполняться в нерабочее время, если вы не возражаете против блокировки процессов из таблицы.
В зависимости от вашего конкретного сценария любой вариант может быть лучше для вас. Я бы не выбрал вариант, потому что вы должны запускать его в нерабочее время. В конечном счете, время, которое вы проводите обновление в середине ночи, будет хорошо проведено по сравнению с головными болями, с которыми вы, возможно, столкнетесь, сделав короткое сокращение, чтобы сэкономить пару часов.
Все сказанное, если вы собираетесь выбрать вариант 2, вы можете свести к минимуму объем работы, которую вы делаете в нерабочее время. Поскольку перед изменением столбца вам необходимо обновить строки до нуля, вы можете медленно направить курсор (относительно выполнения всего этого)
- Пройдите через каждую строку
- Проверьте, не null ли он
- Обновите его соответствующим образом. Это займет много времени, но он не будет блокировать весь блок таблицы, чтобы другие программы обращались к нему. (Не забудьте с (rowlock) подсказкой таблицы!)
EDIT: я просто подумал о третьем варианте: Вы можете создать новую таблицу с соответствующими столбцами, а затем экспортировать данные из исходной таблицы в новую. Когда это будет сделано, вы можете удалить исходную таблицу и изменить имя новой, чтобы она была старой. Для этого вам придется отключить зависимости от оригинала и настроить их на новый, когда вы закончите, но этот процесс значительно сократит объем работы, которую вы должны будете сделать в нерабочее время. Это тот же подход, который использует сервер sql, когда вы делаете изменения упорядочения столбцов в таблицах через студию управления. Для этого подхода я бы сделал вставку в куски, чтобы убедиться, что вы не вызываете стресс от системы и не позволяете другим получить доступ к ней. Затем в нерабочее время вы можете отказаться от оригинала, переименовать второе и применить зависимости и т.д. У вас все еще будет работать нерабочее время, но оно будет незначительным по сравнению с другим подходом.
Ссылка на использование sp_rename.