2014-09-12 13 views
15

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

ALTER TABLE Employee ADD CONSTRAINT DF_SomeName DEFAULT N'SANDNES' FOR CityBorn; 

Но согласно this мой запрос должен работать:

ALTER TABLE MyTable ALTER COLUMN CreateDate DATETIME NOT NULL 
     CONSTRAINT DF_Constraint DEFAULT GetDate() 

Так вот я m пытается сделать мою колонку Not Null, а также установить значение по умолчанию. Но получить синтаксическую ошибку Incoorect возле CONSTRAINT. Я пропустил?

+0

Я думаю, вам нужно 'ADD CONSTRAINT', как в вашем первом примере. – Andrew

ответ

9

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

Надеюсь, что это поможет !!!

+0

правый на месте. если я правильно понимаю, Microsoft необходимо обновить их содержимое: http://msdn.microsoft.com/en-us/library/ms187742%28v=sql.110%29.aspx – SZT

+0

нет .. если вы правильно прочитали первую строку затем он 'Определяет свойства столбца, который ** добавлен ** в таблицу, используя ALTER TABLE. Поэтому вы всегда можете написать что-то как: «ALTER TABLE ** ADD ** COLUMN .. CONSTRAINT .. DEFAULT; ' – Deepshikha

+0

wow you r right again :) microsoft нужно поместить эти звезды вокруг« добавленного »хаха – SZT

5

Для изменения существующего столбца вам необходимо:

ALTER TABLE MyTable ALTER COLUMN CreateDate DATETIME NOT NULL; 
ALTER TABLE MyTable ADD CONSTRAINT DF_Constraint DEFAULT GetDate() FOR CreateDate; 
1

Из MSDN ALTER TABLE примеров:

Д. Добавление DEFAULT ограничение к существующему столбцу

Следующая пример создает таблицу с двумя столбцами и вставляет значение в первый столбец, а другой столбец остается NULL. A 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; 
2

Это должно быть -

ALTER TABLE MyTable 
ALTER COLUMN CreateDate DATETIME NOT NULL; 

ALTER TABLE MyTable 
ADD CONSTRAINT DF_Constraint DEFAULT GetDate() FOR CreateDate; 
4

Там нет прямого способа изменить значение столбца в сервере 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 '[email protected]+' DROP CONSTRAINT '[email protected] +'; ALTER TABLE '+ @table 
     + ' ADD CONSTRAINT ' + @constraintName +' DEFAULT '[email protected]+' FOR '[email protected] 

    EXECUTE sp_executesql @constraintQuery 
END 

Просто заполните параметры и выполнить. Сценарий удаляет существующее ограничение и создает новый с заданным значением по умолчанию.

+0

Это лучший ответ для всех вопросов, связанных с« как изменить колонку значение по умолчанию'? Он принимает во внимание, что существует существующее значение по умолчанию, и это значение по умолчанию может иметь сгенерированное системой имя, и оно может быть написано сценарием и не зависит от ручного наблюдения/манипуляции. – mickeyf

Смежные вопросы