我经常在博客、文章、书籍、论坛、SO 等中的 TSQL 中创建表的脚本中看到“非空主键”。
例如,如果在“not null”NEAR“primary key”“sql server”附近搜索,BING 会给出 630,000 个结果((仅英文):
http://www.bing.com/search?q=%22not+null%22+NEAR+%22primary+key%22+%22sql+server%22&go=&form=QBRE&filt=lf
我一直认为“NOT NULL”是 PRIMARY KEY 定义不可分割的一部分,至少在 SQL Server 中是这样。
我尝试在 SQL Server 中创建一个带有主键和不带“NOT NULL”的表,但无法掌握可能的差异。
为什么即使在快速(短)插图中也都使用“NOT NULL”来创建主键?
<小时/>更新:
NULL 如何识别任何内容或者是唯一的(以及在允许的情况下防止多个 NULL)?未指定、缺失、不适用的值
我的问题还暗示了子问题:
如果为 PK 定义“NOT NULL”,为什么不指定 UNIQUE?
PK的定义是什么?它是唯一约束+非空还是唯一索引(那么为什么非空)?
请给我相关 msdn 文档的链接。
更新2:@Damien_The_Un believeer
为什么没有“NOT NULL”就不是同义词?
CREATE TABLE T3
(
PK int -- NOT NULL commented out
, nonPK int -- to double-check my sanity
, constraint PK_vgv8 PRIMARY KEY (PK) on [PRIMARY]
)
仍然不允许 NULL 给出:
-
Microsoft SQL Server Management Studio
No row was updated.
The data in row 2 was not committed. Error Source: .Net SqlClient Data Provider. Error Message: Cannot insert the value NULL into column 'PK', table 'TestData.dbo.T3'; column does not allow nulls. INSERT fails.
The statement has been terminated.
Correct the errors and retry or press ESC to cancel the change(s).
OK Help
更新3:
这个概念和术语定义可能看起来不切实际,令人讨厌。
事实并非如此,一些关于基本概念的错误陈述(在沟通/讨论期间其他人的观点)足以被视为白痴并在专业互动和沟通中造成障碍。
我忘了告诉你,NOT NULL是SSMS为PK编写的脚本!
最佳答案
为清楚起见进行了编辑
根据SQL规范,主键不能包含NULL。这意味着用“NOT NULL PRIMARY KEY”或仅“PRIMARY KEY”装饰列应该做同样的事情。但您所依赖的 SQL 引擎正确遵循 SQL 标准。举个例子,由于早期的错误,SQL Lite 没有正确实现该标准,并允许非整数主键中存在空值(请参阅 sqlite.org/lang_createtable.html )。这意味着(至少)SQLLite 这两个语句做了两件不同的事情。
由于“NOT NULL PRIMARY KEY”清楚地表明了意图,并且即使删除主键也继续使用非空值,因此这应该是首选语法。
关于sql-server - 为什么在SQL中使用 "not null primary key"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3905703/