insertar una columna NOT NULL en una tabla existente

121

Yo he tratado:

ALTER TABLE MY_TABLE 
ADD STAGE INT NOT NULL;

Pero da este mensaje de error:

ALTER TABLE solo permite agregar columnas que pueden contener nulos o tener una definición DEFAULT especificada

ANP
fuente

Respuestas:

222

Como opción, puede crear inicialmente una columna Null-able, luego actualizar la columna de su tabla con valores válidos no nulos y finalmente ALTER column para establecer la restricción NOT NULL:

ALTER TABLE MY_TABLE ADD STAGE INT NULL
GO
UPDATE MY_TABLE SET <a valid not null values for your column>
GO
ALTER TABLE MY_TABLE ALTER COLUMN STAGE INT NOT NULL
GO

Otra opción es especificar el valor predeterminado correcto para su columna:

ALTER TABLE MY_TABLE ADD STAGE INT NOT NULL DEFAULT '0'

UPD: tenga en cuenta que la respuesta anterior contiene lo GOque es imprescindible cuando ejecuta este código en el servidor Microsoft SQL. Si desea realizar la misma operación en Oracle o MySQL, debe usar un punto y coma ;así:

ALTER TABLE MY_TABLE ADD STAGE INT NULL;
UPDATE MY_TABLE SET <a valid not null values for your column>;
ALTER TABLE MY_TABLE ALTER COLUMN STAGE INT NOT NULL;
Pavel Morshenyuk
fuente
1
Personalmente, prefiero la primera forma aquí si tiene valores que puede poner en el campo manualmente. De esa manera, no tiene que preocuparse por crear y eliminar una restricción predeterminada donde no la necesita.
Mark W Dickson
1
@acarlon: creo que eso está llegando. La updateafirmación peligrosa que menciona sería perjudicial en cualquier consulta. Debería ser lo suficientemente simple como para ver si tiene una columna adicional en la updatedeclaración aquí. Por lo general, agregaría solo una columna o dos a la vez. Si agrega una columna adicional a su updatedeclaración que no pertenece allí, en este ejemplo, entonces tal vez no debería estar a cargo de los datos en primer lugar.
Mark W Dickson
1
Los desarrolladores de ANDROID que utilizan SQLite deben saber que ALTER COLUMNNO es compatible con SQLite.
Sdghasemi
2
Nunca lo había visto GOantes y parece que no forma parte de la especificación SQL , por lo que probablemente provocará fallas en las secuencias de comandos que no se ejecutan con una de las herramientas que lo admiten. ¿Solo usa punto y coma? No recomiendo difundir los estándares de Microsoft, ya que rara vez se preocupan por un estándar establecido y razonable, sino que inventan los suyos solo para que se inventen los suyos propios. Aparte de eso, útil respuesta.
Neonit
2
@Neon, gracias por el comentario, pero la pregunta original era sobre el servidor MS SQL, por eso GO está ahí. Pero agregaré una nota al respecto a mi respuesta.
Pavel Morshenyuk
13

Si no permite que la columna sea nula, debe proporcionar un valor predeterminado para completar las filas existentes. p.ej

ALTER TABLE dbo.YourTbl ADD
    newcol int NOT NULL CONSTRAINT DF_YourTbl_newcol DEFAULT 0

En Enterprise Edition, este es un cambio de metadatos solo desde 2012

Martin Smith
fuente
2
No es necesario , pero es una opción.
Matt
6

El mensaje de error es bastante descriptivo, intente:

ALTER TABLE MyTable ADD Stage INT NOT NULL DEFAULT '-';
Arkansas
fuente
y ¿cuál es el significado del "menos" en la parte predeterminada?
Mladen B.
3

Otras implementaciones de SQL tienen restricciones similares. La razón es que agregar una columna requiere agregar valores para esa columna (lógicamente, aunque no físicamente), que por defecto es NULL. Si no lo permite NULLy no tiene un default, ¿cuál será el valor?

Dado que SQL Server es compatible ADD CONSTRAINT, recomendaría el enfoque de Pavel de crear una columna anulable y luego agregar una NOT NULLrestricción después de haberla llenado con no NULLvalores.

dan04
fuente
MySQL admite la adición de columnas no nulas en la tabla existente con datos, donde el valor vacío "sensible" para el tipo de datos se proporciona en las filas existentes (es decir, 0.0 para flotante, 0 para entero, cadena vacía para cadena, etc.).
Michael Tsang
2

Esto funcionó para mí, también se puede "tomar prestado" de la vista de diseño, hacer cambios -> clic derecho -> generar script de cambio.

BEGIN TRANSACTION
GO
ALTER TABLE dbo.YOURTABLE ADD
    YOURCOLUMN bit NOT NULL CONSTRAINT DF_YOURTABLE_YOURCOLUMN DEFAULT 0
GO
COMMIT
pabbie
fuente
1
ALTER TABLE `MY_TABLE` ADD COLUMN `STAGE` INTEGER UNSIGNED NOT NULL AFTER `PREV_COLUMN`;
ajoejoseph
fuente
0
Alter TABLE 'TARGET' add 'ShouldAddColumn' Integer Not Null default "0"
AKronis1369
fuente
1
¿Qué agrega esta respuesta a este tema?
barbsan