29

我知道您可以像这样更改现有列的默认值:

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 并设置默认值。但是在 CONSTRAINT 附近出现 Inoorect 语法错误。我错过了什么吗?

4

5 回答 5

20

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

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

ALTER TABLE MyTable ALTER COLUMN CreateDate DATETIME NOT NULL;

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

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

希望这可以帮助!!!

于 2014-09-12T17:02:42.243 回答
9

没有直接的方法来更改 SQL Server 中列的默认值,但以下参数化脚本将完成工作:

DECLARE @table NVARCHAR(100);
DECLARE @column NVARCHAR(100);
DECLARE @newDefault NVARCHAR(100);
SET @table = N'TableName';
SET @column = N'ColumnName';
SET @newDefault = N'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 = N'ALTER TABLE ' + @table + N' DROP CONSTRAINT '
        + @constraintName + N'; ALTER TABLE ' + @table + N' ADD CONSTRAINT '
        + @constraintName + N' DEFAULT ' + @newDefault + N' FOR ' + @column;

    EXECUTE sp_executesql @constraintQuery;
END;

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

于 2015-07-07T21:20:20.947 回答
6

要更改现有列,您需要:

ALTER TABLE MyTable ALTER COLUMN CreateDate DATETIME NOT NULL;
ALTER TABLE MyTable ADD CONSTRAINT DF_Constraint DEFAULT GetDate() FOR CreateDate;
于 2014-09-12T16:12:17.817 回答
5

它应该是 -

ALTER TABLE MyTable
ALTER COLUMN CreateDate DATETIME NOT NULL;

ALTER TABLE MyTable 
ADD CONSTRAINT DF_Constraint DEFAULT GetDate() FOR CreateDate;
于 2014-09-12T16:13:50.817 回答
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;
于 2014-09-12T16:12:26.327 回答