首页 > 解决方案 > SQL Server 时间戳类型列可以为 NULL 吗?

问题描述

我在https://docs.microsoft.com/en-us/sql/t-sql/statements/create-table-transact-sql?view=sql-server-ver15阅读了关于“CREATE TABLE”的文档

它说

时间戳数据类型必须为 NOT NULL。

但是,当我创建一个表时,我可以创建一个时间戳类型的字段并使其可以为空。那么,问题是什么?

更新

使用以下查询时:

USE MyDB6;

CREATE TABLE MyTable (Col1 timestamp NULL);

我预计会出现一个错误,指出列 Col1 不能为 NULL,但没有任何反应。

创建表后,我运行以下查询:

USE MyDB6

SELECT COLUMNPROPERTY(OBJECT_ID('MyTable', 'U'), 'Col1', 'AllowsNull');

我希望结果是 0,但实际上是 1。

所以,我的问题是,虽然文档已经说“时间戳数据类型必须不是 NULL。”,在实际情况下,这种数据类型也不会是 NULL,为什么创建表查询不会阻止我将其设置为可为空且系统仍将列保存为可为空?

标签: sql-servernulltimestamp

解决方案


就像 marc_s 在他们的评论中所说的那样,这种数据类型是在内部处理的,永远不会为空。尝试以下操作:

declare @test timestamp = null -- ROWVERSION would be less confusing 

select @test

它不返回NULL

至于为什么允许您将其设置为可空;通过创建与标准的这种偏差会赢得什么?您不能将 NULL 插入到 TIMESTAMP/ROWVERSION 列中,您根本不能更新它。我想改变 CREATE 语法以使某些数据类型不可为空是相当麻烦的;麻烦多于其价值。


推荐阅读