2013-08-23 25 views
2

我有下列的表:为空的日期时间列添加到主键

[ClauseID] [int] NOT NULL, 
[PolicyCategoryID] [int] NOT NULL, 
[ExpiryDate] [smalldatetime] NULL, 

现在ClauseIDPolicyCategoryID一起创建的主键。但我想ExpiryDate也是主键的一部分。为了使列不为空,我尝试了以下内容,但它给出了一个错误:

ALTER TABLE tblClauses_PolicyCategory 
ALTER COLUMN [ExpiryDate] SMALLDATETIME NOT NULL DEFAULT '2079-06-06' 

Incorrect syntax near the keyword 'DEFAULT'. 

任何想法为什么?是否可以设置这样的默认日期?

编辑:坏!默认密钥已被设置。这肯定是它给出错误的原因。

+0

使用'alter column'修改数据类型,'add constraint'添加默认约束 – Andomar

+0

为什么要使主键的'ExpiryDate'部分?用一个任意默认值'2079-06-06'替换一个NULLable列(是YMD还是YDM btw?)是非常值得怀疑的决定。 –

+0

2079-06-06是您可以在MS SQL Server中输入的最大日期。它不是一个任意值 – kapz

回答

2

试试这个:,

ALTER TABLE tblClauses_PolicyCategory 
ALTER COLUMN [ExpiryDate] SMALLDATETIME NOT NULL 

ALTER TABLE tblClauses_PolicyCategory ADD CONSTRAINT 
cons_expiryDate DEFAULT '2079-06-06' FOR ExpiryDate 

之前执行这些线条,请检查是否存在某些行与ExpiryDate空,如果是,请,全部更新为空的行为默认值

+1

如果您尚未完成此操作,则在将其设置为NOT NULL之前将所有NULL值更新为 – TToni

+1

Joe所说的内容是您无法在添加期间使用ALTER COLUMN添加约束。要在创建的列上这样做,最明确地添加约束。 –

0

我认为这将有助于你:

CREATE TABLE tblClauses_PolicyCategory(
[ClauseID] [int] NOT NULL, 
[PolicyCategoryID] [int] NOT NULL, 
[ExpiryDate] [smalldatetime] NULL) 


ALTER TABLE tblClauses_PolicyCategory 
ALTER COLUMN [ExpiryDate] SMALLDATETIME NOT NULL 

ALTER TABLE tblClauses_PolicyCategory 
ADD CONSTRAINT cons_default DEFAULT '2079-06-06' FOR ExpiryDate 

但是,改变ExpireDate为NOT NULL,则必须填充值在此列现有行,然后更改列前NOT NULL。