sql-server - change - cambiar una columna de null a not null sql server
Alterar una columna: nulo a no nulo (11)
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 configurar 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 ( ColumnA
) a " not null
". Suponga que los datos se han actualizado para que no contengan valores nulos.
Utilizando el servidor SQL 2000 .
En el caso de FOREIGN KEY CONSTRAINT
... habrá un problema si ''0'' no está presente en la columna de la tabla de claves primarias. La solución para eso es ...
PASO 1:
Deshabilita 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"
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 al realizar este cambio, ya que el valor predeterminado sería nulo al crear un conflicto.
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 modificarlas. Se actualiza al valor predeterminado (0) en este ejemplo, si el valor era nulo.
Hacer una columna no nula y agregar valores predeterminados también se puede hacer en la GUI de SSMS.
- Como ya han dicho otros, no puede establecer "no nulo" hasta que todos los datos existentes sean "no nulos", por lo que:
UPDATE myTable SET myColumn = 0
- Una vez hecho esto, con la tabla en la vista de diseño (haga clic con el botón derecho en la tabla y haga clic en "vista de diseño"), simplemente puede desactivar las columnas Permitir valores nulos de la siguiente manera:
- 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í también, así:
Mientras la columna no sea un identificador único
UPDATE table set columnName = 0 where columnName is null
Entonces
Modifique la tabla y configure el campo como no nulo y especifique un valor predeterminado de 0
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 el cambio: se queja (al menos en SQL Developer) de que la columna ya no es nula.
Para el javaDB incorporado incluido en el JDK (la distribución soportada por Oracle del Apache Derby), el siguiente trabajo funcionó para mí.
alter table [table name] alter column [column name] not null;
Primero, haz que todos los valores NULL actuales desaparezcan:
UPDATE [Table] SET [Column]=0 WHERE [Column] IS NULL
Luego, actualice la definición de la tabla para no permitir NULLs:
ALTER TABLE [Table] ALTER COLUMN [Column] INTEGER NOT NULL
Tendrás que hacerlo en dos pasos:
- Actualice la tabla para que no haya nulos en la columna.
UPDATE MyTable SET MyNullableColumn = 0
WHERE MyNullableColumn IS NULL
- Alterar la tabla para cambiar la propiedad de la columna.
ALTER TABLE MyTable
ALTER COLUMN MyNullableColumn MyNullableColumnDatatype NOT NULL
Tuve el mismo problema, pero el campo solía ser nulo por defecto, y ahora quiero hacerlo 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];
esto funcionó para mí:
ALTER TABLE [Table]
Alter COLUMN [Column] VARCHAR(50) not null;