Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 为什么要使用“;“非空主键”;在TSQL中?_Sql Server_Tsql_Database Design_Primary Key - Fatal编程技术网

Sql server 为什么要使用“;“非空主键”;在TSQL中?

Sql server 为什么要使用“;“非空主键”;在TSQL中?,sql-server,tsql,database-design,primary-key,Sql Server,Tsql,Database Design,Primary Key,我经常在博客、文章、书籍、论坛以及SO中看到在TSQL中创建表的脚本中出现“NOTNULL primary key” 例如,如果要搜索“主键”“sql server”附近的“not null”,BING会给出630000个结果(仅英文): 我一直认为“NOTNULL”是主键定义中不可分割的一部分,至少在SQL Server中是这样。 我试图在SQL Server中创建一个主键为“NOTNULL”和“NOTNULL”的表,但无法理解可能的区别 为什么即使在快速(简短)的插图中,所有人都使用“NO

我经常在博客、文章、书籍、论坛以及SO中看到在TSQL中创建表的脚本中出现“NOTNULL primary key”

例如,如果要搜索“主键”“sql server”附近的“not null”,BING会给出630000个结果(仅英文):

我一直认为“NOTNULL”是主键定义中不可分割的一部分,至少在SQL Server中是这样。
我试图在SQL Server中创建一个主键为“NOTNULL”和“NOTNULL”的表,但无法理解可能的区别

为什么即使在快速(简短)的插图中,所有人都使用“NOTNULL”来创建主键


更新:
NULL如何标识任何内容或是唯一的(如果允许,还可以防止多个NULL)?它是未指定的、缺少的、不适用的值

我的问题还隐含了子问题:
如果为PK定义了“NOTNULL”,为什么不指定UNIQUE?
PK的定义是什么?是唯一约束+非空还是唯一索引(那么为什么非空)?
请给我msdn文档的链接

更新2:@Damien\u异教徒

为什么同义词没有“notnull”

仍然不允许空给出:


  • Microsoft SQL Server管理工作室


    未更新任何行

    第2行中的数据未提交。 错误源:.Net SqlClient数据提供程序。 错误消息:无法将值NULL插入到“PK”列、表“TestData.dbo.T3”中;列不允许为NULL。插入失败

    声明已终止

    更正错误并重试,或按ESC取消更改


    好的,救命


更新3:
这个概念和术语定义可能看起来不切实际。
事实并非如此,一些关于基本概念的错误陈述(在交流/讨论过程中,其他人的观点)足以被视为白痴,并在专业互动和交流中造成障碍

我忘了告诉你,非空是由SSMS为PK编写的脚本!

为清晰起见进行了编辑

根据SQL规范,主键不能包含NULL。这意味着用“notnull primary key”或“primary key”装饰列应该做同样的事情。但是您正确地依赖于所讨论的SQL引擎遵循SQL标准。例如,由于早期的错误,SQL Lite没有正确地实现该标准,并且允许非整数主键中的空值(请参阅)。这意味着(至少)对于SQLLite,这两条语句做两件不同的事情


由于“NOT NULL PRIMARY KEY”(非空主键)明确表示意图,即使删除主键,也会继续执行非空值,因此这应该是首选语法。

在语法上不需要,因为无论其他列的默认设置如何,如果未为主键列指定,这将是默认值

SET ANSI_NULL_DFLT_ON ON /*Set default for columns to allow NULL if not specified*/

CREATE TABLE #t
(
i INT PRIMARY KEY,
j INT
)

SELECT name,is_nullable
FROM tempdb.sys.columns 
WHERE object_id=object_id('tempdb..#t')


INSERT INTO #t VALUES (1,NULL) /*Succeeds as j allows NULL*/

INSERT INTO #t VALUES (NULL, 1)/*Won't succeed as column doesn't allow nulls*/

DROP TABLE #t

所有主键都表示它是表的标识符,因此根据定义是唯一的。唯一并不表示不为null,因此,如果您要求主键不能为null,则必须如此明确地指定。如果允许null,则表示列中可以有null值,但只允许有一个因为它必须是唯一的。

以下内容:

CREATE TABLE T1 (
    T1ID int not null primary key
)
CREATE TABLE T1 (
    T1ID int not null,
    constraint <system generated name> PRIMARY KEY (T1ID) on [PRIMARY]
)
实际上是以下内容的简写:

CREATE TABLE T1 (
    T1ID int not null primary key
)
CREATE TABLE T1 (
    T1ID int not null,
    constraint <system generated name> PRIMARY KEY (T1ID) on [PRIMARY]
)
创建表T1(
T1ID int不为空,
约束[主]上的主键(T1ID)
)
列定义实际上与约束定义是完全独立的。只是简写隐藏了它是两个独立定义的事实。(当然,如果使用长格式,可以跨多个列定义主键)

Edit,作为对update的响应。否,您仍然不能在主键中有一个可为空的列。但是,考虑到在create table语句中指定每一列的可为空性是正常的,忽略它感觉很奇怪(即使主键约束暗示/要求它)

创建表T1(
T1ID int,
约束[主]上的主键(T1ID)
)
创建与前一个代码示例完全相同的表。因此,显式指定列的“NOTNULL”功能更像是对结果的显式确认,而不是要求


最后,您会发现它经常出现在示例代码中,因为人们开发了自己的数据库,然后使用内置的SQL工具从数据库生成脚本-脚本工具总是显式地放置所有内容。

我不知道有哪种DBMS允许在主键构造中使用可空列SQL标准指定主键约束中的列不能为空


在关系模型中,候选键由唯一值组成,而不是空值。SQL的一个特点是,可以在唯一约束中选择使用可空列。该功能可能导致许多数据质量问题。我强烈建议您避免在唯一约束中使用可空列。如有必要,请创建新的taMYSQL的有趣之处在于,当您将NULL(或0)值传递给
主键自动递增
字段时,这种行为非常适合

说你有

create table Users(

  userId int primary key auto_increment

) ;

insert into users( userId ) values ( null ) ; -- insert OK
select * from Users ;  -- Shows 1
因此,如果将0或NULL传递给
自动增量
字段,它只会选择下一个可用值

如果去掉
auto_increment
属性,插入带有
NULL
的主键字段失败,因为主键不能为NULL,这就是错误。因此
PRIMARY KEY NOT NULL
上的
NOT NULL
至少在MySQL中是隐式的。