sql-server - 为什么在SQL中使用 "not null primary key"?

标签 sql-server tsql database-design primary-key

我经常在博客、文章、书籍、论坛、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/

相关文章:

database-design - 存储和查询树的最有效方法是什么?

c# - 并行遍历多个大型数据集

java - 所有 ListView 数据仅插入一行

sql - 跳过特定值后的连续行

sql查询累加值计算

sql-server - 如何为现有列设置默认值

sql - 显示与另一个表 sql server 不匹配的空值

algorithm - 公交预约数据库设计

c# - 打开 sql 连接时出错 : 'MyConnection.ServerVersion' threw an exception of type 'System.InvalidOperationException'

php - 如何存储 Multi-Tenancy 密码?