【问题标题】:Can SQL Server timestamp type column be NULL?SQL Server 时间戳类型列可以为 NULL 吗?
【发布时间】:2021-08-15 09:28:30
【问题描述】:

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

它说

时间戳数据类型不能为空。

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

更新

使用以下查询时:

USE MyDB6;

CREATE TABLE MyTable (Col1 timestamp NULL);

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

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

USE MyDB6

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

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

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

【问题讨论】:

  • 因为 TIMESTAMP 列(实际上是二进制行号 - 因此数据类型现在被正确称为 ROWVERSION)由 SQL Server 本身专门处理,并在内部设置为新值每次更新行时 - 它永远不会是 NULL - 无论你定义什么......
  • @marc_s,看看我的 cmets

标签: sql-server null timestamp


【解决方案1】:

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

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

select @test

它不返回NULL

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

【讨论】:

  • 见我的 cmets。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多