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.