将可空的rowversion列添加到表中

时间:2017-02-14 00:34:02

标签: sql-server rowversion

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

2 个答案:

答案 0 :(得分:2)

  

如果他们给你选择使它成为可空类型,那么可空与可空之间的功能区别是什么

在实践中没有功能差异(但可能存在差异,见下文)。您无法将NULL插入rowversion列。

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

docs只提到可以为rowversion一次:

  

非可空rowversion列在语义上等同于a   binary(8)列。可以为空的rowversion列是语义上的   相当于varbinary(8)列。

如果指定rowversion为空,则应占用磁盘上的更多空间,以便存储可能的NULL值(实际上不会发生这种情况)。每个可空列都会产生开销,请参阅:How much size "Null" value takes in SQL Server

  

除了存储空值所需的空间之外,还有   有可空列的开销。

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

说完这一切后,我尝试创建两个表,每个表有10M行。一个具有可空rowversion列,第二个具有不可为空的rowversion列。在我的测试中,两个表都占用了相同数量的磁盘空间。我在SQL Server 2014 Express上进行了测试。

答案 1 :(得分:0)

即使将其设置为NULL,rowversion也会获取一个值:

CREATE TABLE MyTest (myKey int PRIMARY KEY, myValue int);  
GO   
INSERT INTO MyTest (myKey, myValue) VALUES (1, 0);  
GO   
INSERT INTO MyTest (myKey, myValue) VALUES (2, 0);  
GO  
SELECT * FROM MyTest;
GO
ALTER TABLE MyTest ADD rv rowversion NULL;
GO
SELECT * FROM MyTest;
GO
DROP TABLE MyTest;

+-------+---------+------------+
| myKey | myValue | rv         |
+-------+---------+------------+
| 1     | 0       | 0000020331 |
+-------+---------+------------+
| 2     | 0       | 0000020332 |
+-------+---------+------------+

在此处查看:http://rextester.com/ENELE48783