Par coïncidence, j'ai dû faire quelque chose de très similaire il y a environ 3 heures. La table faisait 35m de rangées, elle est assez large, et ça prenait une éternité pour faire ça :
alter table myTable add myNewColumn int not null default 0;
Voici ce que j'ai fini par faire :
alter table myTable add myNewColumn int null;
while 1=1
begin
update top (100000) myTable
set
myNewColumn = 0
where
myNewColumn is null;
if @@ROWCOUNT = 0 break;
end
alter table myTable alter column myNewColumn int not null;
alter table myTable add constraint tw_def_myNewColumn default (0) for myNewColumn;
Cette fois-ci, la alter table
les déclarations ont été quasi instantanées. Il a fallu environ 7 à 8 minutes (sur un serveur lent) pour effectuer les lots de mise à jour. Je suppose que SQL Server générait une annulation dans ma requête d'origine pour restaurer les valeurs, mais je ne m'attendais pas à ce que cela commence.
Quoi qu'il en soit, dans votre cas, peut-être que quelque chose de similaire aiderait. Vous pouvez essayer d'ajouter une nouvelle colonne bigint, mettre à jour la nouvelle colonne par lots, puis définir les contraintes dessus.