sql - una - Modificar el valor predeterminado de la columna
modificar valor por defecto de una columna sql (5)
Creo que el problema aquí es con la confusión entre los comandos Create Table
y Alter Table
. Si observamos Create table
, podemos agregar un valor predeterminado y una restricción predeterminada al mismo tiempo que:
<column_definition> ::=
column_name <data_type>
[ FILESTREAM ]
[ COLLATE collation_name ]
[ SPARSE ]
[ NULL | NOT NULL ]
[
[ CONSTRAINT constraint_name ] DEFAULT constant_expression ]
| [ IDENTITY [ ( seed,increment ) ] [ NOT FOR REPLICATION ]
]
[ ROWGUIDCOL ]
[ <column_constraint> [ ...n ] ]
[ <column_index> ]
ex:
CREATE TABLE dbo.Employee
(
CreateDate datetime NOT NULL
CONSTRAINT DF_Constraint DEFAULT (getdate())
)
ON PRIMARY;
Puede verificar la definición completa aquí: http://msdn.microsoft.com/en-IN/library/ms174979.aspx
pero si observamos la definición de Alter Table
, con ALTER TABLE ALTER COLUMN
no se puede agregar CONSTRAINT
las opciones disponibles para ADD
son:
| ADD
{
<column_definition>
| <computed_column_definition>
| <table_constraint>
| <column_set_definition>
} [ ,...n ]
Consulte aquí: http://msdn.microsoft.com/en-in/library/ms190273.aspx
Así que tendrás que escribir dos declaraciones diferentes una para la columna Alterar como:
ALTER TABLE MyTable ALTER COLUMN CreateDate DATETIME NOT NULL;
y otro para modificar la tabla y agregar una restricción predeterminada
ALTER TABLE MyTable ADD CONSTRAINT DF_Constraint DEFAULT GetDate() FOR CreateDate;
¡¡¡Espero que esto ayude!!!
Sé que puedes cambiar el valor predeterminado de una columna existente como this :
ALTER TABLE Employee ADD CONSTRAINT DF_SomeName DEFAULT N''SANDNES'' FOR CityBorn;
Pero de acuerdo con this mi consulta se supone que funciona:
ALTER TABLE MyTable ALTER COLUMN CreateDate DATETIME NOT NULL
CONSTRAINT DF_Constraint DEFAULT GetDate()
Así que aquí estoy tratando de hacer que mi columna no sea nula y también establecer el valor predeterminado. Pero obteniendo Incoorect Syntax Error cerca de CONSTRAINT. ¿Me estoy perdiendo algo?
De MSDN ALTER TABLE ejemplos:
D. Agregar una restricción DEFAULT a una columna existente
El siguiente ejemplo crea una tabla con dos columnas e inserta un valor en la primera columna, y la otra columna permanece en NULL . Luego se agrega una restricción DEFAULT a la segunda columna. Para verificar que se aplique el valor predeterminado, se inserta otro valor en la primera columna y se consulta la tabla.
CREATE TABLE dbo.doc_exz ( column_a INT, column_b INT) ;
GO
INSERT INTO dbo.doc_exz (column_a)VALUES ( 7 ) ;
GO
ALTER TABLE dbo.doc_exz
ADD CONSTRAINT col_b_def
DEFAULT 50 FOR column_b ;
GO
INSERT INTO dbo.doc_exz (column_a) VALUES ( 10 ) ;
GO
SELECT * FROM dbo.doc_exz ;
GO
DROP TABLE dbo.doc_exz ;
GO
Así que en definitiva, necesitas el ADD CONSTRAINT
ALTER TABLE MyTable
ALTER COLUMN CreateDate DATETIME NOT NULL ;
ALTER TABLE MyTable
ADD CONSTRAINT DF_Constraint DEFAULT GetDate() FOR CreateDate;
Debería ser -
ALTER TABLE MyTable
ALTER COLUMN CreateDate DATETIME NOT NULL;
ALTER TABLE MyTable
ADD CONSTRAINT DF_Constraint DEFAULT GetDate() FOR CreateDate;
No hay una forma directa de cambiar el valor predeterminado de una columna en el servidor SQL, pero el siguiente script parametrizado hará el trabajo:
DECLARE @table nvarchar(100)
DECLARE @column nvarchar(100)
DECLARE @newDefault nvarchar(100)
SET @table=''TableName''
SET @column=''ColumnName''
SET @newDefault=''0''
IF EXISTS (select name from sys.default_constraints
where parent_object_id = object_id(@table)
and parent_column_id = columnproperty(object_id(@table), @column, ''ColumnId''))
BEGIN
DECLARE @constraintName as nvarchar(200)
DECLARE @constraintQuery as nvarchar(2000)
SELECT @constraintName = name from sys.default_constraints
where parent_object_id = object_id(@table) and parent_column_id = columnproperty(object_id(@table),@column, ''ColumnId'')
SET @constraintQuery = ''ALTER TABLE ''+@table+'' DROP CONSTRAINT ''+@constraintName +''; ALTER TABLE ''+ @table
+ '' ADD CONSTRAINT '' + @constraintName +'' DEFAULT ''+@newDefault+'' FOR ''+@column
EXECUTE sp_executesql @constraintQuery
END
Solo llena los parámetros y ejecuta. El script elimina la restricción existente y crea una nueva con un valor predeterminado designado.
Para alterar una columna existente necesitas:
ALTER TABLE MyTable ALTER COLUMN CreateDate DATETIME NOT NULL;
ALTER TABLE MyTable ADD CONSTRAINT DF_Constraint DEFAULT GetDate() FOR CreateDate;