Изменить значение столбца по умолчанию
Я знаю, что вы можете изменить значение по умолчанию для существующего столбца следующим образом:
ALTER TABLE Employee ADD CONSTRAINT DF_SomeName DEFAULT N'SANDNES' FOR CityBorn;
Но согласно этому мой запрос должен работать:
ALTER TABLE MyTable ALTER COLUMN CreateDate DATETIME NOT NULL
CONSTRAINT DF_Constraint DEFAULT GetDate()
Поэтому здесь я пытаюсь сделать мой столбец не пустым, а также установить значение по умолчанию. Но получаю Неправильную Синтаксическую Ошибка возле CONSTRAINT. Я скучаю по чему-то?
5 ответов
Я думаю, что проблема здесь заключается в путанице между Create Table
а также Alter Table
команды. Если мы посмотрим на Create table
тогда мы можем добавить значение по умолчанию и ограничение по умолчанию одновременно с:
<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;
Вы можете проверить полное определение здесь: http://msdn.microsoft.com/en-IN/library/ms174979.aspx
но если мы посмотрим на Alter Table
определение затем с ALTER TABLE ALTER COLUMN
вы не можете добавить CONSTRAINT
варианты, доступные для ADD
являются:
| ADD
{
<column_definition>
| <computed_column_definition>
| <table_constraint>
| <column_set_definition>
} [ ,...n ]
Проверьте здесь: http://msdn.microsoft.com/en-in/library/ms190273.aspx
Таким образом, вам придется написать два разных оператора, одно для изменяющегося столбца, как:
ALTER TABLE MyTable ALTER COLUMN CreateDate DATETIME NOT NULL;
и другой для изменения таблицы и добавления ограничения по умолчанию
ALTER TABLE MyTable ADD CONSTRAINT DF_Constraint DEFAULT GetDate() FOR CreateDate;
Надеюсь это поможет!!!
Не существует прямого способа изменить значение по умолчанию для столбца в SQL-сервере, но следующий параметризованный скрипт сделает эту работу:
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
Просто заполните параметры и выполните. Сценарий удаляет существующее ограничение и создает новое с заданным значением по умолчанию.
Так должно быть -
ALTER TABLE MyTable
ALTER COLUMN CreateDate DATETIME NOT NULL;
ALTER TABLE MyTable
ADD CONSTRAINT DF_Constraint DEFAULT GetDate() FOR CreateDate;
Для изменения существующего столбца вам необходимо:
ALTER TABLE MyTable ALTER COLUMN CreateDate DATETIME NOT NULL;
ALTER TABLE MyTable ADD CONSTRAINT DF_Constraint DEFAULT GetDate() FOR CreateDate;
Из MSDN ALTER TABLE примеры:
D. Добавление ограничения DEFAULT в существующий столбец
В следующем примере создается таблица с двумя столбцами и вставляется значение в первый столбец, а другой столбец остается пустым. Затем ограничение DEFAULT добавляется во второй столбец. Чтобы убедиться, что применяется значение по умолчанию, другое значение вставляется в первый столбец и запрашивается таблица.
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
Короче говоря, вам нужно ADD CONSTRAINT
ALTER TABLE MyTable
ALTER COLUMN CreateDate DATETIME NOT NULL ;
ALTER TABLE MyTable
ADD CONSTRAINT DF_Constraint DEFAULT GetDate() FOR CreateDate;