我会保持这简短而甜蜜。我正在尝试将类型rowversion
的列添加到现有表中。我的想法是,通过将其添加为NULL
,现有的行不会加盖时间戳,但它们是唉。如果这是行为,那么列在什么情况下会允许空值?
答案 0 :(得分:2)
如果他们给你选择使它成为可空类型,那么可空与可空之间的功能区别是什么
在实践中没有功能差异(但可能存在差异,见下文)。您无法将NULL
插入rowversion
列。
即使您在NULL
语句中为rowversion
列指定了INSERT
,服务器也会插入生成的非空值。无论您如何声明rowversion
列(NULL
或NOT NULL
),它都会像这样工作。
docs只提到可以为rowversion
一次:
非可空
rowversion
列在语义上等同于abinary(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 |
+-------+---------+------------+