我会简短而甜蜜的。我正在尝试将rowversion类型的列添加到现有表中。我的想法是,通过将其添加为NULL,不会对现有行加盖时间戳,但可惜它们是时间戳。如果是这种情况,那么在什么情况下该列会接受空值?

最佳答案



在实践中,没有功能上的差异(但可能存在存储差异,请参见下文)。您不能将NULL插入rowversion列。

即使您在NULL语句中为rowversion列指定INSERT,服务器也会插入生成的非null值。无论您如何声明rowversion列(NULLNOT NULL),它都将像这样工作。

docs仅提及一次可为空的rowversion:



如果您将rowversion指定为可空值,则它应该在磁盘上占据更多空间,以允许存储可能的NULL值(实际上是不会发生的)。每个可为空的列都会产生开销,请参阅:How much size "Null" value takes in SQL Server



此外,与varbinary(8)相比,binary(8)在磁盘上占用的空间更多,以存储值的长度。

说了这么多,我试图创建两个表,每个表有10M行。一个带有可空rowversion列,第二个带有不可空rowversion列。在我的测试中,两个表占用的磁盘空间完全相同。我在SQL Server 2014 Express上进行了测试。

关于sql-server - 向表添加可为空的rowversion列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42215930/

10-11 02:52