Alterando uma coluna: nulo para não nulo

1217

Eu tenho uma tabela que possui várias colunas inteiras anuláveis. Isso é indesejável por vários motivos, por isso estou procurando atualizar todos os nulos para 0 e depois definir essas colunas para NOT NULL. Além de alterar nulos para 0, os dados devem ser preservados.

Estou procurando a sintaxe específica do SQL para alterar uma coluna (chame-a ColumnA) para " not null". Suponha que os dados foram atualizados para não conter nulos.

Usando o SQL Server 2000 .

Karmic Coder
fonte
16
Outra coisa - você pode adicionar um padrão para que quaisquer inserções existentes que não especifiquem a coluna não falhem: ALTER TABLE FOO ADD CONSTRAINT FOO_Bar_Default PADRÃO 0 PARA Bar
Marc Gravell
4
Além disso, você pode se surpreender ao saber que, em algumas circunstâncias, alterar uma coluna NOT NULLpode causar muitos registros.
Martin Smith

Respostas:

2012

Primeiro, faça todos os NULLvalores atuais desaparecerem:

UPDATE [Table] SET [Column]=0 WHERE [Column] IS NULL

Em seguida, atualize a definição da tabela para não permitir "NULLs":

ALTER TABLE [Table] ALTER COLUMN [Column] INTEGER NOT NULL
mdb
fonte
49
Deixe-me agregar valor às duas respostas corretas acima. A semântica do NULL pode ter alguns significados. Um dos significados comuns é DESCONHECIDO. Tome SCORE como um exemplo. Uma pontuação nula e uma pontuação zero é um mundo de diferença! Antes de você fazer as recomendações acima. Certifique-se de que seu aplicativo não seja nulo em sua lógica de negócios.
TechTravelThink
242
Faça backup do seu banco de dados primeiro, caso você digite um erro de digitação e seu banco de dados exploda.
fácil
20
Não é estranho o MS SQL Management Studio não permite essa opção, ele se gaba de "table deixando cair ..."
Sebastian
14
Sempre é necessário fazer backup dos bancos de dados. Você nunca sabe quando um de seus funcionários pode escrever uma instrução UPDATE ou DELETE e esquecer a cláusula WHERE.
Vivian Rio
2
@SebastianGodelet: existe uma configuração que permite desativar esse aviso ou fazer com que ele não impeça a modificação da tabela. Em alguns casos, alterar o esquema de uma tabela exige que uma nova tabela seja criada, os dados copiados da tabela antiga e a tabela antiga descartada. Como um erro nesse processo pode resultar na perda de dados, o SSMS avisa e, por padrão, impede que você faça isso.
siride
57

Eu tive o mesmo problema, mas o campo costumava usar como padrão nulo e agora quero usar como padrão 0. Isso exigiu a adição de mais uma linha após a solução do mdb:

ALTER TABLE [Table] ADD CONSTRAINT [Constraint] DEFAULT 0 FOR [Column];
Greg Dougherty
fonte
Isso não responde ao problema. O padrão já está definido, é o NOT NULL que precisa ser alterado. Com apenas sua resposta, todos os registros existentes permanecerão nulos e o problema permanece.
PandaWood 26/08/2015
6
Você leu a parte sobre "adicionar mais uma linha"? Como, além disso, é a resposta acima?
Greg Dougherty
7
Na verdade, não está claro que "adicionar mais uma linha" significa "além da resposta acima" (especialmente porque existem muitas respostas "acima") - se é isso que você quis dizer, então o texto realmente precisa mudar e você deve inclua a linha da resposta a que você se refere
PandaWood
2
Só queria entrar em cena e dizer que é uma boa ideia nomear explicitamente suas restrições, incluindo os padrões. Se você precisar soltar uma coluna, precisará saber o nome da restrição a ser eliminada antes de poder. Encontrei isso em nossas migrações de banco de dados algumas vezes. Eu sei que o exemplo inclui aqui, mas ainda é um local em que alguns desenvolvedores viajam porque o nome não é obrigatório.
jocull
38

Você precisará fazer isso em duas etapas:

  1. Atualize a tabela para que não haja nulos na coluna.
UPDATE MyTable SET MyNullableColumn = 0
WHERE MyNullableColumn IS NULL
  1. Altere a tabela para alterar a propriedade da coluna
ALTER TABLE MyTable
ALTER COLUMN MyNullableColumn MyNullableColumnDatatype NOT NULL
Ralph Wiggum
fonte
27

Para o Oracle 11g, consegui alterar o atributo da coluna da seguinte maneira:

ALTER TABLE tablename MODIFY columnname datatype NOT NULL;

Caso contrário, a resposta de abatichev parecia boa. Você não pode repetir a alteração - ela reclama (pelo menos no SQL Developer) que a coluna já não é nula.

JDM
fonte
Parece que no Oracle 11, você não precisa repetir o datatype. Apenas columname NOT NULLé suficiente. Veja a documentação .
jpmc26
18

isso funcionou para mim:

ALTER TABLE [Table] 
Alter COLUMN [Column] VARCHAR(50) not null;
Dheeraj Sam
fonte
16

Desde que a coluna não seja um identificador exclusivo

UPDATE table set columnName = 0 where columnName is null

Então

Altere a tabela e defina o campo como não nulo e especifique um valor padrão de 0

Eppz
fonte
4

isso parece mais simples, mas funciona apenas no Oracle:

ALTER TABLE [Table] 
ALTER [Column] NUMBER DEFAULT 0 NOT NULL;

Além disso, com isso, você também pode adicionar colunas, não apenas alterá-lo. Ele atualiza para o valor padrão (0) neste exemplo, se o valor for nulo.

csomakk
fonte
Sim, mas o Google direciona as pessoas para cá. Ele recebeu muitos upvotes por causa disso e muitos downwotes. Eu acho que é útil. Todo mundo é livre para ignorar isso, mas sinceramente penso e vejo que isso está ajudando as pessoas.
Csomakk 17/08/16
Por favor, leia as regras de SO. Como escrevo uma boa resposta? , RESPONDENDO PERGUNTAS TÉCNICAS COM AJUDA e Escreva a pergunta perfeita . Notas: Não tenha medo de excluir (ou editar intensamente) respostas inúteis e não "responda e execute
#
4

No caso de FOREIGN KEY CONSTRAINT ... haverá um problema se '0' não estiver presente na coluna da tabela Chave Primária. A solução para isso é ...

PASSO 1:

Desative todas as restrições usando este código:

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

PASSO 2:

RUN UPDATE COMMAND (as mentioned in above comments)
RUN ALTER COMMAND (as mentioned in above comments)

ETAPA 3:

Habilite todas as restrições usando este código:

exec sp_msforeachtable @command1="print '?'", @command2="ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"
sam05
fonte
4

No meu caso, tive dificuldades com as respostas postadas. Acabei usando o seguinte:

ALTER TABLE table_name CHANGE COLUMN column_name column_name VARCHAR(200) NOT NULL DEFAULT '';

mudança VARCHAR(200) para o seu tipo de dados e, opcionalmente, altere o valor padrão.

Se você não tiver um valor padrão, terá um problema ao fazer essa alteração, pois o padrão seria nulo criando um conflito.

Philip Kirkbride
fonte
1

Vamos dar um exemplo:

TABLE NAME=EMPLOYEE

E eu quero mudar a coluna EMPLOYEE_NAMEpara NOT NULL. Esta consulta pode ser usada para a tarefa:

ALTER TABLE EMPLOYEE MODIFY EMPLOYEE.EMPLOYEE_NAME datatype NOT NULL;
Ashish Dwivedi
fonte
Por favor, não grite e use formatação para tornar sua postagem mais legível. Por exemplo, ajuda a reconhecer a parte do código. stackoverflow.com/editing-help
Yunnosch 26/04/19
Além disso, não escreva mais texto em maiúsculas. Considera-se gritar na internet
Zoe
1
@PawanTiwari, faça edições completas. Você não resolveu todos os problemas da postagem. A maior parte é capitalizada.
double-beep
bip duplo, claro que vou manter isso em mente. Graças
Pawan Tiwari
Além das questões de formatação, torne mais óbvio que insight adicional sua resposta fornece, em comparação com as respostas mais antigas de Ralph Wiggum, JDM, Rashmi Singh e trooper31, que parecem funcionalmente idênticas à primeira vista. Parece necessário apontar os pontos mais delicados da sua solução. Tente evitar a impressão de respostas apenas copiando ...
Yunnosch
0

Para o javaDB embutido incluído no JDK (distribuição suportada pelo Oracle do Apache Derby), o abaixo funcionou para mim

alter table [table name] alter column [column name] not null;
trooper31
fonte
0

Tornar a coluna não nula e adicionar padrão também pode ser feita na GUI do SSMS.

  1. Como outros já declararam, você não pode definir "não nulo" até que todos os dados existentes sejam "não nulos", assim:

UPDATE myTable SET myColumn = 0

  1. Feito isso, com a tabela no modo de design (clique com o botão direito do mouse na tabela e clique em "modo de design"), basta desmarcar as colunas Permitir Nulos da seguinte forma:

insira a descrição da imagem aqui

  1. Ainda no modo de design com a coluna selecionada, você pode ver as Propriedades da coluna na janela abaixo e definir o padrão como 0, assim:

insira a descrição da imagem aqui

Tony L.
fonte
Vejo o voto negativo, mas não consigo corrigir nada sem feedback. Por favor, deixe-me saber se algo não funcionou.
Tony L.
-1

Você pode alterar a definição da coluna do banco de dados existente usando o seguinte sql.

ALTER TABLE mytable modify mycolumn datatype NOT NULL;
Rashmi singh
fonte