2010-10-22 20 views
44

¿Puedo agregar una columna que es especifico como NOT NULL, no quiero para especificar el valor por defecto, pero MS-SQL 2005 dice:¿Puedo agregar una columna no nula y sin valor DEFAULT

ALTER TABLE solo permite agregar columnas que pueden contener nulos, o tener una definición DEFAULT especificada, o la columna que se agrega es una columna de identidad o de marca de tiempo, o alternativamente si no se cumple ninguna de las condiciones previas, la tabla debe estar vacía para permitir la adición de esta columna La 'prueba' de columna no se puede agregar a la 'lista de envío' de la tabla no vacía porque no cumple estas condiciones.

En caso afirmativo, comuníqueme la sintaxis, si es No, especifique el motivo.

Respuesta

59

No, no puedes.

Porque si pudiera, SQL no sabría qué poner como valor en los registros ya existentes. Si no tenía ningún registro en la tabla, funcionaría sin problemas.

La forma más sencilla de hacerlo es crear la columna con un valor predeterminado y luego eliminar la predeterminada.

ALTER TABLE dbo.MyTable ADD 
MyColumn text NOT NULL CONSTRAINT DF_MyTable_MyColumn DEFAULT 'defaultValue' 
ALTER TABLE dbo.MyTable 
DROP CONSTRAINT DF_MyTable_MyColumn 

Otra alternativa sería añadir la columna sin la restricción, llenar los valores de todas las células y añadir la restricción.

8

n - SQL Server bastante razonable rechaza esto, porque que no sabría qué filas existentes de valor deben tener

Es fácil crear un valor predeterminado, al mismo tiempo, y luego se deja caer inmediatamente.

18

Agregue la columna a la tabla, actualice las filas existentes para que ninguna de ellas sea nula y luego agregue una restricción "no nula".

+3

Esta es una solución mejor que crear/soltar el defecto, si el la lógica para los nuevos valores es más compleja que una simple constante. –

+0

Por qué, o cómo, es posible que sea mejor actualizar (¿manualmente?) + Cambiar a "no nulo, en lugar de" actualizar "automáticamente a través de la opción predeterminada + cambiar a" no predeterminado "(soltar por defecto)? –

+0

@ vgv8 - ¿Qué pasa si los nuevos valores en cada fila dependen de otras columnas que ya están en la fila? No se puede expresar a través de una restricción predeterminada. –

0

sólo tiene que utilizar una cadena vacía '' (en el caso de tipo de carácter) o 0 (si numérico), etc., como valor por defecto

0

No, no se puede, como SQL Server, o cualquier otros motores de base de datos obligarán a esta nueva columna a ser nula para las filas existentes en su tabla de datos. Pero como no permite un NULL, debe proporcionar un valor predeterminado para respetar su propia restricción. ¡Esto cae bajo gran sentido! El DBE no extrapolará un valor para valores no nulos para las filas existentes.

+0

Si bien lo que dices tiene sentido, no es cierto que al menos un "motor de base de datos" sea MS Access, lo que permite que una columna 'NOT NULL' sea agregado a una tabla sin especificar también un 'DEFAULT', el r Esult de los valores nulos en una columna 'NOT NULL'. Proporcionaré una prueba como respuesta ... – onedaywhen

0

@Damien_The_Unbeliever's comment, ¿Está agregando una columna calculada? Ni la pregunta ni la respuesta implicaban nada de eso. En caso de columna calculada los estados de error:

"solamente es único o restricciones PRIMARY KEY se pueden crear en las columnas calculadas, mientras VER, clave externa y restricciones NOT NULL requieren que las columnas calculadas pueden conservar"

bien, si continuar con este juego de adivinanzas, aquí está mi script que ilustra la adición de la columna "nO NULO" en una "ALTER TABLE" paso:

CREATE TABLE TestInsertComputedColumn 
(
    FirstName VARCHAR(100), 
    LastName CHAR(50) 
); 

insert into TestInsertComputedColumn(FirstName,LastName) 
    select 'v', 'gv8'; 
select * from TestInsertComputedColumn; 

ALTER TABLE TestInsertComputedColumn 
     ADD FullName As FirstName + LastName PERSISTED NOT NULL; 

select * from TestInsertComputedColumn; 
--drop TABLE TestInsertComputedColumn; 
1

no, no puede.Sin embargo, se puede considerar para especificar el valor predeterminado de ('')

1

que utilizar este método para insertar columna NOT NULL sin valor predeterminado

ALTER TABLE [Table] ADD [Column] INT NULL 
GO 
UPDATE [Table] SET [Column] = <default_value> 
ALTER TABLE [Table] ALTER COLUMN [Column] INT NOT NULL 
Cuestiones relacionadas