更改列默认值

时间:2014-09-12 16:00:52

标签: sql sql-server default-value notnull

我知道您可以更改现有列的默认值,例如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()

所以我在这里尝试使我的列Not Null并设置默认值。但在CONSTRAINT附近获取Incoorect语法错误。我错过了吗?

5 个答案:

答案 0 :(得分:11)

我认为这里的问题是Create TableAlter 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

因此,您必须为Altering column编写两个不同的语句:

ALTER TABLE MyTable ALTER COLUMN CreateDate DATETIME NOT NULL;

和另一个用于更改表并添加默认约束

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

希望这有帮助!!!

答案 1 :(得分:5)

要更改现有列,您需要:

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

答案 2 :(得分:5)

没有直接的方法来更改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 '+@table+' DROP CONSTRAINT '+@constraintName +'; ALTER TABLE '+ @table 
        + ' ADD CONSTRAINT ' + @constraintName +' DEFAULT '+@newDefault+' FOR '+@column 

    EXECUTE sp_executesql @constraintQuery  
END 

只需填写参数并执行即可。该脚本删除现有约束并创建一个具有指定默认值的新约束。

答案 3 :(得分:2)

应该是 -

ALTER TABLE MyTable
ALTER COLUMN CreateDate DATETIME NOT NULL;

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

答案 4 :(得分:1)

来自MSDN ALTER TABLE示例:

<强> d。将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;