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.