Modificar tabla: cómo cambiar el atributo 'Permitir nulos' de no nulo para permitir nulo


207

¿Cómo cambiar un atributo en una tabla usando T-SQL para permitir nulos (no nulos -> nulos)? ¿Alterar la mesa tal vez?


12
SQL Server Management Studio crea un script muy complejo para una tarea tan simple. Es por eso que me confundí y verifiqué stackoverflow. Tal vez ese es el punto de la pregunta ...
Tillito

Respuestas:


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

44
O de la misma ALTER TABLE your_table ALTER COLUMN your_column NVARCHAR(42)manera que, de forma predeterminada, permitirá valores nulos si no se especifica explícitamente de otra manera.
Martin Smith

3
Tenga en cuenta que si necesita cambiar varias columnas para permitir nulo, deberá ejecutar ALTER TABLE .. ALTER COLUMN ..comandos separados
sonyisda1

2
Tenga en cuenta que hay algunos casos en los que esto podría no funcionar: vea esta respuesta de intercambio de pila de DBA si obtiene unALTER TABLE ALTER COLUMN failed because one or more objects access this column.
Jarrod Dixon

49

Sí, puedes usar ALTER TABLElo siguiente:

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

Citando de la ALTER TABLEdocumentación:

NULLse puede especificar ALTER COLUMNpara forzar a una NOT NULLcolumna a permitir valores nulos, excepto para columnas en restricciones de PRIMARY KEY.


22

ALTER TABLE es correcto:

ALTER TABLE MyCustomers ALTER COLUMN CompanyName VARCHAR(20) NULL

2
¿Está seguro de que necesita redefinir las restricciones y solo el tipo de datos? El artículo de MSDN no menciona que las restricciones tendrían que redefinirse: "Si NULL o NOT NULL se especifica con ALTER COLUMN, new_data_type [(precision [, scale])] también debe especificarse. Si el tipo de datos, precisión y la escala no se modifica, especifique los valores actuales de la columna ".
Daniel Vassallo

@Daniel Vassallo - Tienes razón. Estaba tratando de completar, pero cambiar NULL / NOT NULL debería ser el único cambio.
Oded

5

Para MySQL, MariaDB

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

Usar en MODIFY COLUMNlugar de ALTER COLUMN.


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

2
@ ÁronLőrincz la pregunta no es sobre Postgres. Está etiquetado como SQL Server, por lo que esta respuesta es incorrecta.
Martin Smith

Tienes razón, pero aún así me ayudó y creo que es un comentario útil para las personas que encuentran la pregunta a través de Google. El título de la pregunta no deja claro de qué servidor de base de datos se trata.
Aron Lorincz

1

Escribí esto para poder editar todas las tablas y columnas a nulo a la 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

Este es el enfoque para hacer esto: -

  1. Compruebe si la tabla o columna existe o no.
  2. En caso afirmativo, modifique la columna. p.ej:-
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  

Si no tiene ningún esquema, elimine la línea de esquema porque no necesita dar el esquema predeterminado.


0

Entonces la forma más simple es,

alter table table_name change column_name column_name int(11) NULL;
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.