Изменить значение столбца по умолчанию

Я знаю, что вы можете изменить значение по умолчанию для существующего столбца следующим образом:

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;
Другие вопросы по тегам