将TIMESTAMP列从NULL更改为NOT NULL

时间:2019-04-02 14:54:25

标签: sql sql-server

我有一个MS-SQL数据库,其中包含很多具有TIMESTAMP列的表。这些列中的大多数都不是可为空的,但是其中一些是不可为空的,因此我想将可为空的列更改为不可为空。

但是以下我用谷歌搜索的SQL语句应该将列从可为空更改为不可为空

IF EXISTS (SELECT o.name FROM sysobjects o WHERE o.xtype='U' AND o.name='TableName')
BEGIN
    ALTER TABLE TableName ALTER COLUMN [Timestamp] TIMESTAMP NOT NULL
END

SQL Server告诉我,Timestamp列不能更改为timestamp数据类型(我不这样做)。

我的陈述是否有问题,或者一旦将TIMESTAMP列创建为可为空,就不能将其设置为不可为空? 有没有一种方法可以更改列的可空性而不提供其数据类型? 还是真的必须完全删除该列,然后重新创建?

我知道为列名提供与某些关键字相同的名称是不受欢迎的,但这就像它一样,我无法更改。

使用SQL-Server 2008 R2和更高版本。

1 个答案:

答案 0 :(得分:2)

要回答您的问题(或我认为您的问题是什么),timestamprowversion的同义词。您不能将列更改为timestamp / rowversion列。同样,声明为timestamp / rowversion的列将永远不会具有NULL值。 DB<>Fiddle引用文档(rowversion (Transact-SQL) - Remarks (snippet)):

  

每次修改或插入具有rowversion列的行时,都会在rowversion列中插入增量的数据库rowversion值。

如果您需要在创建表后添加rowversion,那么它们都将被赋予rowversion的值。 DB<>fiddle

同样值得注意的是,rowversion已过时(引用以上文档):

  

不建议使用时间戳语法。此功能处于维护模式,并且可能在将来的Microsoft SQL Server版本中删除。避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序。

我怀疑您真正想得到的是经过date(time)修改的列,这是完全不同的事情。 timestamp尽管是名字,但与时间无关:

  

rowversion数据类型只是一个递增数字,并不保留日期或时间。要记录日期或时间,请使用datetime2数据类型。

因此,如文档所述,请使用datetime2(或其他日期(时间)数据类型)。