На это есть много ответов, но я чувствую необходимость добавить этот расширенный метод. Это кажется намного дольше, но это чрезвычайно полезно, если вы добавляете поле NOT NULL в таблицу с миллионами строк в активной базе данных.
ALTER TABLE {schemaName}.{tableName}
ADD {columnName} {datatype} NULL
CONSTRAINT {constraintName} DEFAULT {DefaultValue}
UPDATE {schemaName}.{tableName}
SET {columnName} = {DefaultValue}
WHERE {columName} IS NULL
ALTER TABLE {schemaName}.{tableName}
ALTER COLUMN {columnName} {datatype} NOT NULL
Что это будет делать, это добавить столбец как пустое поле со значением по умолчанию, обновить все поля до значения по умолчанию (или вы можете назначить более значимые значения), и, наконец, он изменит столбец на NOT NULL.
Причина этого в том, что если вы обновляете крупномасштабную таблицу и добавляете новое ненулевое поле, оно должно записываться в каждую строку и тем самым блокирует всю таблицу, когда добавляется столбец, а затем записывает все значения.
Этот метод добавляет столбец, который может обнуляться, который работает намного быстрее сам по себе, а затем заполняет данные перед установкой ненулевого статуса.
Я обнаружил, что выполнение всего этого в одном выражении блокирует одну из наших более активных таблиц на 4-8 минут, и довольно часто я убиваю этот процесс. Этот метод каждая часть обычно занимает всего несколько секунд и вызывает минимальную блокировку.
Кроме того, если у вас есть таблица в области миллиардов строк, возможно, стоит обновить пакет следующим образом:
WHILE 1=1
BEGIN
UPDATE TOP (1000000) {schemaName}.{tableName}
SET {columnName} = {DefaultValue}
WHERE {columName} IS NULL
IF @@ROWCOUNT < 1000000
BREAK;
END