sql-server - 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,为什么创建表查询不会阻止我将其设置为可为空且系统仍将列保存为可为空?
解决方案
就像 marc_s 在他们的评论中所说的那样,这种数据类型是在内部处理的,永远不会为空。尝试以下操作:
declare @test timestamp = null -- ROWVERSION would be less confusing
select @test
它不返回NULL
至于为什么允许您将其设置为可空;通过创建与标准的这种偏差会赢得什么?您不能将 NULL 插入到 TIMESTAMP/ROWVERSION 列中,您根本不能更新它。我想改变 CREATE 语法以使某些数据类型不可为空是相当麻烦的;麻烦多于其价值。
推荐阅读
- python - 从 Numpy 中的 npz 调用带有关键字参数的数组
- sql - 我应该如何将原始查询响应传递给 Serializer 类?
- flutter - << 类型是什么?飞镖中的变量名>>语法?
- javascript - 如何使用 JavaScript 按 Ctrl + L 键
- string - 按钮文本“>”和“<”未转换为 xamarin 形式的“>”和“<”
- jupyter-notebook - vscode jupyter notebook报错Error: Session cannot generate requests
- extjs - 在 ComboBox MultiSelect extjs 上加载数据
- flutter - 如何在颤动中固定 SSL 证书的公钥?
- php - PHP WebDriver - JavaScriptError: Document was unloaded
- c# - Parallel.Foreach 对并发字典中一个键的值(并发包)