创建表时的 IDENTITY NOT NULL

16

请问在创建表时使用IDENTITY NOT NULL指令是否多余?我的意思是,根据消息提示“DEFAULT或NULL不能作为明确的标识值”,我认为声明为IDENTITY的任何列也隐含地声明为NOT NULL,但我想确认一下。请有经验的人士确认一下,非常感谢。


问题似乎是:“如果某些东西被暗示了,那么明确声明它是否‘冗余’?”答案似乎是主观的。在由PRIMARY KEY组成的列上声明NOT NULL是否多余?如果NO ACTION引用操作总是多余的,为什么它还存在? - onedaywhen
2个回答

11

尽管在创建表时没有指定,SQL Server会自动向标识列添加NOT NULL约束。

考虑以下的表脚本:

create table test(id int identity(1,1), name varchar(1000))

现在从管理工具中生成表的脚本。它会生成如下脚本:

CREATE TABLE [dbo].[test](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [name] [varchar](1000) NULL
) ON [PRIMARY]

尽管在表脚本中没有指定NOT NULL约束,但默认情况下它会被添加。标识列永远不会为NULL。因此,默认情况下会添加NOT NULL约束。


2
如果您没有指定NULL或NOT NULL,SQL将把标识列设置为NOT NULL。我个人总是会指定它,以避免存在SET ANSI_NULL_DFLT_OFFSET ANSI_NULL_DFLT_ON命令所固有的混淆。 - Philip Kelley

1

SQL Server(2008年及可能更早版本)不允许您在NULL列上创建标识列。试试看:

CREATE TABLE Foo1
 (
   FooId  int  identity not null
  ,Data  varchar(20)  not null
 )

工作,何处

CREATE TABLE Foo2
 (
   FooId  int  identity null
  ,Data  varchar(20)  not null
 )

生成错误信息:无法在可空列'FooId',表'Foo2'上创建IDENTITY属性。


最终你的回答有点暗示了 NOT NULL 是被隐含的。 :) - Andriy M
1
是的,我后来意识到了,在给@Pranay的帖子添加评论之后。我的编码总体看法是始终避免使用“隐式代码”。永远不要假设SQL会按照你认为它应该做的去做,而是要付出额外的努力(比如输入“not null”)来清晰地指示计算机执行的方向。 - Philip Kelley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接