2014-09-12 143 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