inserir uma coluna NOT NULL em uma tabela existente

121

Eu tentei:

ALTER TABLE MY_TABLE 
ADD STAGE INT NOT NULL;

Mas dá esta mensagem de erro:

ALTER TABLE só permite a adição de colunas que podem conter nulos ou ter uma definição DEFAULT especificada

ANP
fonte

Respostas:

222

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 GOque é 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;
Pavel Morshenyuk
fonte
1
Eu pessoalmente prefiro a primeira forma aqui se você tem valores que pode colocar no campo manualmente. Dessa forma, você não precisa se preocupar em criar e excluir uma restrição padrão onde não precisa de uma.
Mark W Dickson
1
@acarlon - Acho que está alcançando. A updatedeclaração perigosa que você mencionou seria prejudicial em qualquer consulta. Deve ser simples o suficiente para ver se você tem uma coluna extra na updateinstrução aqui. Em geral, você adicionaria apenas uma ou duas colunas de cada vez. Se acontecer de você adicionar uma coluna extra em sua updateinstrução que não pertence lá, neste exemplo, então talvez você não deva ser o responsável pelos dados em primeiro lugar.
Mark W Dickson
1
Os desenvolvedores do ANDROID que usam SQLite devem estar cientes de que ALTER COLUMNNÃO é compatível com SQLite.
Sdghasemi
2
Eu nunca vi GOantes 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.
Neonit
2
@Neon obrigado pelo comentário, mas a pergunta original era sobre o servidor MS SQL, é por isso que o GO está lá. Mas acrescentarei uma observação sobre isso à minha resposta.
Pavel Morshenyuk
13

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

Martin Smith
fonte
2
Você não precisa , mas é uma opção.
Matt
6

A mensagem de erro é bastante descritiva, tente:

ALTER TABLE MyTable ADD Stage INT NOT NULL DEFAULT '-';
a'r
fonte
e qual é o significado do "menos" na parte padrão?
Mladen B.
3

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 NULLe 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 NULLrestrição depois de preenchê-la com não NULLvalores.

dan04
fonte
O MySQL suporta a adição de colunas não nulas na tabela existente com dados, onde o valor vazio "sensível" para o tipo de dados é fornecido nas linhas existentes (ou seja, 0,0 para float, 0 para inteiro, string vazia para string, etc).
Michael Tsang de
2

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
pabbie
fonte
1
ALTER TABLE `MY_TABLE` ADD COLUMN `STAGE` INTEGER UNSIGNED NOT NULL AFTER `PREV_COLUMN`;
Ajoejoseph
fonte
0
Alter TABLE 'TARGET' add 'ShouldAddColumn' Integer Not Null default "0"
AKronis1369
fonte
1
O que esta resposta adiciona a este tópico?
barbsan