Значение по умолчанию для столбцов
Я знаю, что вы можете изменить значение по умолчанию для существующего столбца, например this:
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()
Итак, здесь я пытаюсь сделать свою колонку Not Null, а также установить значение по умолчанию. Но получить синтаксическую ошибку Incoorect возле CONSTRAINT. Не хватает ли я?
Ответы
Ответ 1
Я думаю, что проблема здесь связана с путаницей между командами 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;
Надеюсь, это поможет!!!
Ответ 2
Для изменения существующего столбца вам необходимо:
ALTER TABLE MyTable ALTER COLUMN CreateDate DATETIME NOT NULL;
ALTER TABLE MyTable ADD CONSTRAINT DF_Constraint DEFAULT GetDate() FOR CreateDate;
Ответ 3
Нет прямого способа изменить значение по умолчанию для столбца на SQL-сервере, но следующий параметр script выполнит следующую работу:
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 '[email protected]+' DROP CONSTRAINT '[email protected] +'; ALTER TABLE '+ @table
+ ' ADD CONSTRAINT ' + @constraintName +' DEFAULT '[email protected]+' FOR '[email protected]
EXECUTE sp_executesql @constraintQuery
END
Просто заполните параметры и выполните. script удаляет существующее ограничение и создает новый с указанным значением по умолчанию.
Ответ 4
Из MSDN ALTER TABLE примеры:
Д. Добавление ограничения DEFAULT в существующий столбец
Следующий пример создает таблицу с двумя столбцами и вставляет значение в первый столбец, а другой столбец остается NULL. Затем во второй столбец добавляется ограничение 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;
Ответ 5
Должно быть -
ALTER TABLE MyTable
ALTER COLUMN CreateDate DATETIME NOT NULL;
ALTER TABLE MyTable
ADD CONSTRAINT DF_Constraint DEFAULT GetDate() FOR CreateDate;