2014-09-12 146 views
15

我知道你可以更改現有列的像this默認值:阿爾特列默認值

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試圖讓我的列不空,並設置默認值。但是在CONSTRAINT附近獲得Incoorect語法錯誤。我錯過了什麼?

+0

我想你需要'ADD CONSTRAINT',就像你的第一個例子。 – Andrew 2014-09-12 16:02:57

回答

9

我覺得這裏的問題是Create TableAlter 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; 

您可以檢查完整的定義在這裏: 如果我們看一下Create table那麼我們可以在同一時間添加一個默認值和默認約束 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 2014-09-12 17:14:53

+0

否..如果您正確閱讀第一行那麼它'指定通過使用ALTER TABLE將**添加到表的列的屬性。所以你總是可以寫下如下內容:'ALTER TABLE ** ADD ** COLUMN .. CONSTRAINT .. DEFAULT; ' – Deepshikha 2014-09-12 17:27:13

+0

你再次右轉:)微軟需要把這些星星圍繞「增加」haha – SZT 2014-09-16 19:31:59

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例子:

D.添加默認約束現有列

以下示例創建一個包含兩列的表格,並將值插入第一列,而另一列仍爲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 Server中的列的默認值沒有直接的方法,但以下參數的腳本將做的工作:

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 2017-09-11 15:03:33