Respostas:
Como uma opção, você pode inicialmente criar uma coluna que pode ser nula e, em seguida, atualizar a coluna da tabela com valores válidos não nulos e, finalmente, a coluna ALTER para definir a restrição NOT NULL:
ALTER TABLE MY_TABLE ADD STAGE INT NULL
GO
UPDATE MY_TABLE SET <a valid not null values for your column>
GO
ALTER TABLE MY_TABLE ALTER COLUMN STAGE INT NOT NULL
GO
Outra opção é especificar o valor padrão correto para sua coluna:
ALTER TABLE MY_TABLE ADD STAGE INT NOT NULL DEFAULT '0'
UPD: observe que a resposta acima contém o GO
que é obrigatório quando você executa este código no servidor Microsoft SQL. Se você deseja realizar a mesma operação no Oracle ou MySQL, você precisa usar ponto-e-vírgula ;
assim:
ALTER TABLE MY_TABLE ADD STAGE INT NULL;
UPDATE MY_TABLE SET <a valid not null values for your column>;
ALTER TABLE MY_TABLE ALTER COLUMN STAGE INT NOT NULL;
update
declaração perigosa que você mencionou seria prejudicial em qualquer consulta. Deve ser simples o suficiente para ver se você tem uma coluna extra na update
instrução aqui. Em geral, você adicionaria apenas uma ou duas colunas de cada vez. Se acontecer de você adicionar uma coluna extra em sua update
instrução que não pertence lá, neste exemplo, então talvez você não deva ser o responsável pelos dados em primeiro lugar.
ALTER COLUMN
NÃO é compatível com SQLite.
GO
antes e parece não fazer parte da especificação SQL , portanto, provavelmente levará à falha de scripts que não sejam executados por uma das ferramentas que o suportam. Basta usar ponto-e-vírgula? Eu não recomendo espalhar os padrões da Microsoft, pois eles raramente se preocupam com qualquer padrão estabelecido e razoável, mas inventam o seu próprio apenas para ter o seu próprio inventado. Além disso, uma resposta útil.
Se você não está permitindo que a coluna seja nula, você precisa fornecer um padrão para preencher as linhas existentes. por exemplo
ALTER TABLE dbo.YourTbl ADD
newcol int NOT NULL CONSTRAINT DF_YourTbl_newcol DEFAULT 0
Na Enterprise Edition, esta é uma alteração apenas de metadados desde 2012
Outras implementações de SQL têm restrições semelhantes. O motivo é que adicionar uma coluna requer adicionar valores para essa coluna (logicamente, mesmo se não fisicamente), cujo padrão é NULL
. Se você não permitir NULL
e não tiver um default
, qual será o valor?
Como o SQL Server oferece suporte ADD CONSTRAINT
, recomendo a abordagem de Pavel de criar uma coluna anulável e, em seguida, adicionar uma NOT NULL
restrição depois de preenchê-la com não NULL
valores.
Isso funcionou para mim, também pode ser "emprestado" da visualização do projeto, faça alterações -> clique com o botão direito -> gerar script de alteração.
BEGIN TRANSACTION
GO
ALTER TABLE dbo.YOURTABLE ADD
YOURCOLUMN bit NOT NULL CONSTRAINT DF_YOURTABLE_YOURCOLUMN DEFAULT 0
GO
COMMIT
ALTER TABLE `MY_TABLE` ADD COLUMN `STAGE` INTEGER UNSIGNED NOT NULL AFTER `PREV_COLUMN`;
Alter TABLE 'TARGET' add 'ShouldAddColumn' Integer Not Null default "0"