Значение по умолчанию для столбцов

Я знаю, что вы можете изменить значение по умолчанию для существующего столбца, например 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;