Alterar una columna: nulo a no nulo

1218

Tengo una tabla que tiene varias columnas enteras anulables. Esto no es deseable por varias razones, por lo que estoy buscando actualizar todos los valores nulos a 0 y luego establecer estas columnas en NOT NULL. Además de cambiar los valores nulos a 0, los datos deben conservarse.

Estoy buscando la sintaxis SQL específica para modificar una columna (llamarla ColumnA) a " not null". Suponga que los datos se han actualizado para no contener nulos.

Usando SQL Server 2000 .

Codificador kármico
fuente
16
Otra cosa: es posible que desee agregar un valor predeterminado para que cualquier inserción existente que no especifique la columna no falle: ALTERAR TABLA FOO AGREGAR RESTRICCIÓN FOO_Bar_Default DEFAULT 0 FOR Bar
Marc Gravell
44
También es posible que se sorprenda al saber que, en algunas circunstancias, alterar una columna NOT NULLpuede causar muchos registros.
Martin Smith el

Respuestas:

2013

Primero, haga NULLdesaparecer todos los valores actuales :

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

Luego, actualice la definición de la tabla para no permitir "NULL":

ALTER TABLE [Table] ALTER COLUMN [Column] INTEGER NOT NULL
mdb
fuente
49
Permítanme agregar valor a las dos respuestas correctas anteriores. La semántica de NULL puede tener algunos significados. Uno de los significados comunes es DESCONOCIDO. Tome SCORE como ejemplo. ¡Una PUNTUACIÓN nula y una PUNTUACIÓN CERO son un mundo de diferencia! Antes de hacer las recomendaciones anteriores. Asegúrese de que su aplicación no sea nula en su lógica de negocios.
TechTravelThink
242
Haga una copia de seguridad de su base de datos primero en caso de que cometa un error tipográfico y su base de datos explote.
mpen
20
Es extraño que MS SQL Management Studio no permita esa opción, se jacta de "Dejar caer la tabla ..."
Sebastian
14
Las bases de datos siempre deben estar respaldadas. Nunca se sabe cuándo una de sus personas podría escribir y ACTUALIZAR o ELIMINAR una declaración y olvidar la cláusula WHERE.
Vivian River
2
@SebastianGodelet: hay una configuración que le permite desactivar esa advertencia o hacer que no le impida modificar la tabla. En algunos casos, cambiar el esquema de una tabla requiere que se cree una nueva tabla, se copien los datos de la tabla anterior y se elimine la tabla anterior. Debido a que un error en este proceso podría provocar la pérdida de datos, SSMS le advierte y, de manera predeterminada, le impide hacerlo.
siride
57

Tuve el mismo problema, pero el campo solía ser nulo por defecto, y ahora quiero tenerlo por defecto en 0. Eso requería agregar una línea más después de la solución de mdb:

ALTER TABLE [Table] ADD CONSTRAINT [Constraint] DEFAULT 0 FOR [Column];
Greg Dougherty
fuente
Esto no responde al problema. El valor predeterminado ya está establecido, es NOT NOT NULL lo que debe cambiarse. Con solo su respuesta, todos los registros existentes permanecerán NULOS y el problema persiste.
PandaWood
66
¿Leyó la parte sobre "agregar una línea más"? Como en, esto es adicional a la respuesta anterior?
Greg Dougherty
77
En realidad, no, no está claro que "agregar una línea más" signifique "además de la respuesta anterior" (especialmente porque hay muchas respuestas "anteriores"): si eso es lo que quiso decir, entonces la redacción realmente debe cambiar y debería incluye la línea de la respuesta a la que te refieres
PandaWood
2
Solo quería intervenir y decir que es una buena idea nombrar explícitamente sus restricciones, incluidos los valores predeterminados. Si alguna vez necesita soltar una columna, deberá conocer el nombre de la restricción que debe soltar antes de poder hacerlo. Me encontré con esto en nuestras migraciones de DB varias veces. Sé que el ejemplo lo incluye aquí, pero todavía es un lugar que algunos desarrolladores tropiezan porque el nombre no es obligatorio.
jocull
38

Tendrás que hacerlo en dos pasos:

  1. Actualice la tabla para que no haya nulos en la columna.
UPDATE MyTable SET MyNullableColumn = 0
WHERE MyNullableColumn IS NULL
  1. Modifique la tabla para cambiar la propiedad de la columna.
ALTER TABLE MyTable
ALTER COLUMN MyNullableColumn MyNullableColumnDatatype NOT NULL
Ralph Wiggum
fuente
27

Para Oracle 11g, pude cambiar el atributo de columna de la siguiente manera:

ALTER TABLE tablename MODIFY columnname datatype NOT NULL;

De lo contrario, la respuesta de abatichev parecía buena. No puede repetir la modificación: se queja (al menos en SQL Developer) de que la columna ya no es nula.

JDM
fuente
Parece que en Oracle 11, no tiene que repetir el datatype. Simplemente columname NOT NULLes suficiente. Ver la documentación .
jpmc26
18

esto funcionó para mí:

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

Mientras la columna no sea un identificador único

UPDATE table set columnName = 0 where columnName is null

Entonces

Modifique la tabla y establezca el campo en no nulo y especifique un valor predeterminado de 0

Eppz
fuente
4

Esto parece más simple, pero solo funciona en Oracle:

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

Además, con esto, también puede agregar columnas, no solo alterarlo. Se actualiza al valor predeterminado (0) en este ejemplo, si el valor era nulo.

csomakk
fuente
Sí, pero Google dirige a la gente aquí. Recibió muchas votaciones positivas y muchas bajas. Creo que es útil. Todos son libres de ignorar esto, pero honestamente pienso y veo que esto está ayudando a las personas.
csomakk
Por favor, lea las reglas SO. ¿Cómo escribo una buena respuesta? , RESPONDER PREGUNTAS TÉCNICAS ÚTIL y escribir la pregunta perfecta . Notas: No tenga miedo de eliminar (o editar en gran medida) respuestas inútiles y no "responda y ejecute"
Kiquenet
4

En caso de FOREIGN KEY CONSTRAINT... habrá un problema si '0' no está presente en la columna de la tabla de Clave primaria. La solución para eso es ...

PASO 1:

Deshabilite todas las restricciones usando este código:

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

PASO 2:

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

PASO 3:

Habilite todas las restricciones usando este código:

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

En mi caso tuve dificultades con las respuestas publicadas. Terminé usando lo siguiente:

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

Cambie VARCHAR(200)a su tipo de datos y, opcionalmente, cambie el valor predeterminado.

Si no tiene un valor predeterminado, tendrá un problema para realizar este cambio, ya que el valor predeterminado sería nulo creando un conflicto.

Philip Kirkbride
fuente
1

Tomemos un ejemplo:

TABLE NAME=EMPLOYEE

Y quiero cambiar la columna EMPLOYEE_NAMEa NOT NULL. Esta consulta se puede usar para la tarea:

ALTER TABLE EMPLOYEE MODIFY EMPLOYEE.EMPLOYEE_NAME datatype NOT NULL;
Ashish Dwivedi
fuente
Por favor, no grite y utilice el formato para que su publicación sea más legible. Por ejemplo, ayuda para reconocer la parte del código. stackoverflow.com/editing-help
Yunnosch
Además, no escriba texto más largo en mayúsculas. Se considera gritar en Internet
Zoe
1
@PawanTiwari por favor haga ediciones completas. No pareces solucionar todos los problemas de la publicación. La mayor parte está en mayúscula.
pitido doble el
@ doble pitido, claro que lo tendré en cuenta. Gracias
Pawan Tiwari
Además de los problemas de formato, haga más obvio qué información adicional proporciona su respuesta, en comparación, por ejemplo, con las respuestas anteriores de Ralph Wiggum, JDM, Rashmi Singh y trooper31, que parecen funcionalmente idénticas a primera vista. Por lo tanto, parece necesario señalar los puntos más finos de su solución. Trate de evitar la impresión de simplemente copiar las respuestas ...
Yunnosch
0

Para el JavaDB incorporado incluido en el JDK (distribución admitida por Oracle del Apache Derby), lo siguiente funcionó para mí

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

Hacer que la columna no sea nula y agregar valores predeterminados también se puede hacer en la GUI de SSMS.

  1. Como ya han dicho otros, no puede establecer "no nulo" hasta que todos los datos existentes sean "no nulos" de esta manera:

UPDATE myTable SET myColumn = 0

  1. Una vez hecho esto, con la tabla en la vista de diseño (haga clic derecho en la tabla y haga clic en "vista de diseño"), puede desmarcar las columnas Permitir nulos de la siguiente manera:

ingrese la descripción de la imagen aquí

  1. Aún en la vista de diseño con la columna seleccionada, puede ver las Propiedades de la columna en la ventana a continuación y establecer el valor predeterminado en 0 allí, así:

ingrese la descripción de la imagen aquí

Tony L.
fuente
Veo el voto negativo pero no puedo corregir nada sin comentarios. Por favor, avíseme si algo no funcionó.
Tony L.
-1

Puede cambiar la definición de la columna DB existente usando el siguiente sql.

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