Tabela de modificação: como alterar o atributo 'Permitir nulos' de não nulo para permitir nulo


207

Como alterar um atributo em uma tabela usando o T-SQL para permitir nulos (não nulos -> nulos)? Alterar tabela, talvez?


12
O SQL Server Management Studio cria um script muito complexo para uma tarefa tão simples. Por isso fiquei confuso e verifiquei o stackoverflow. Talvez que é o ponto da questão ...
Tillito

Respostas:


363
-- replace NVARCHAR(42) with the actual type of your column
ALTER TABLE your_table
ALTER COLUMN your_column NVARCHAR(42) NULL

4
Ou, assim ALTER TABLE your_table ALTER COLUMN your_column NVARCHAR(42)como será o padrão para permitir nulos de qualquer maneira, se não for especificado explicitamente de outra forma.
Martin Smith

3
Nota Se precisar mudar várias colunas para permitir nulo, então você vai precisar para realizar separados ALTER TABLE .. ALTER COLUMN ..comandos
sonyisda1

2
Observe que há alguns casos em que isso pode não funcionar - veja esta resposta do DBA Stack Exchange se você estiver recebendo uma respostaALTER TABLE ALTER COLUMN failed because one or more objects access this column.
Jarrod Dixon

49

Sim, você pode usar ALTER TABLEo seguinte:

ALTER TABLE [table name] ALTER COLUMN [column name] [data type] NULL

Citando a partir da ALTER TABLEdocumentação:

NULLpode ser especificado ALTER COLUMNpara forçar uma NOT NULLcoluna a permitir valores nulos, exceto para colunas nas restrições PRIMARY KEY.


22

ALTER TABLE está certo:

ALTER TABLE MyCustomers ALTER COLUMN CompanyName VARCHAR(20) NULL

2
Tem certeza de que precisa redefinir as restrições e apenas o tipo de dados? O artigo do MSDN não menciona que as restrições precisariam ser redefinidas: "Se NULL ou NOT NULL for especificado com ALTER COLUMN, new_data_type [(precision [, scale])] também deverá ser especificado. Se o tipo de dados, precisão e escala não são alteradas, especifique os valores atuais da coluna ".
Daniel Vassallo

@ Daniel Vassallo - Você está certo. Eu estava tentando concluir, mas alterar NULL / NOT NULL deve ser a única alteração.
Oded

5

Para MySQL, MariaDB

ALTER TABLE [table name] MODIFY COLUMN [column name] [data type] NULL

Use em MODIFY COLUMNvez de ALTER COLUMN.


4
ALTER TABLE public.contract_termination_requests
ALTER COLUMN management_company_id DROP NOT NULL;

2
@ ÁronLőrincz, a pergunta não é sobre o Postgres. Ele está marcado como SQL Server, portanto esta resposta está incorreta.
Martin Smith

Você está certo, mas ainda me ajudou e acho que é um comentário útil para as pessoas que encontram a pergunta pelo Google. O título da pergunta não deixa claro de qual servidor de banco de dados se trata.
Aron Lorincz

1

Eu escrevi isso para poder editar todas as tabelas e colunas para nulo de uma só vez:

select 
case
when sc.max_length = '-1' and st.name in ('char','decimal','nvarchar','varchar')
then
'alter table  [' + so.name + '] alter column [' + sc.name + '] ' + st.name + '(MAX) NULL'
when st.name in ('char','decimal','nvarchar','varchar')
then
'alter table  [' + so.name + '] alter column [' + sc.name + '] ' + st.name + '(' + cast(sc.max_length as varchar(4)) + ') NULL'
else
'alter table  [' + so.name + '] alter column [' + sc.name + '] ' + st.name + ' NULL'
end as query
from sys.columns sc
inner join sys.types st on st.system_type_id = sc.system_type_id
inner join sys.objects so on so.object_id = sc.object_id
where so.type = 'U'
and st.name <> 'timestamp'
order by st.name

1

Esta é a abordagem para fazer isso: -

  1. Verifique se a tabela ou coluna existe ou não.
  2. Se sim, altere a coluna. por exemplo:-
IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE 
            TABLE_CATALOG = 'DBName' AND 
            TABLE_SCHEMA = 'SchemaName' AND
            TABLE_NAME = 'TableName' AND
            COLUMN_NAME = 'ColumnName')
BEGIN
    ALTER TABLE DBName.SchemaName.TableName ALTER COLUMN ColumnName [data type] NULL
END  

Se você não possui nenhum esquema, exclua a linha do esquema, pois não precisa fornecer o esquema padrão.


0

Então, a maneira mais simples é,

alter table table_name change column_name column_name int(11) NULL;
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.