2011-06-01 19 views
11

任何人都可以告訴我在創建表時指令IDENTITY NOT NULL是否冗餘?我的意思是,通過消息判斷在創建表時IDENTITY NOT NULL

不允許DEFAULT或NULL作爲顯式標識值。

我想說任何聲明爲IDENTITY的列都被隱含地聲明爲NOT NULL,但我想確認一下。任何人都可以確認嗎?

非常感謝。

+0

這個問題似乎是, 「如果事情是隱含的,明確宣佈這是多餘的?」答案似乎是主觀的。在包含'PRIMARY KEY'冗餘的列上聲明'NOT NULL'嗎?如果「不採取行動」的參考行動總是多餘的,爲什麼它存在? – onedaywhen 2011-06-01 13:17:42

回答

8

SQL服務器中不添加NULL約束標識列自動eventhough創建表時,他沒有speficy它

請看下錶腳本

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

現在生成表從Management Studio中的腳本。它生成腳本爲

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

儘管在表格腳本中未指定NOT NULL約束,但它被添加。標識列永遠不會爲NULL。所以添加NOT NULL約束默認

+1

如果您未指定NULL或NOT NULL,則SQL會將標識列設置爲NOT NULL。我,我總是指定它,以避免'SET ANSI_NULL_DFLT_OFF'和'SET ANSI_NULL_DFLT_ON'命令存在的混淆。 – 2011-06-01 15:03:54

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 
) 

產生錯誤信息Could not create IDENTITY attribute on nullable column 'FooId', table 'Foo2'.

+0

最終你的答案意味着NOT NULL是暗含的。 :) – 2011-06-01 16:06:28

+1

是的,後來,我在@Pranay的帖子中添加評論後意識到。我的整體編碼是總是避免使用「隱式代碼」。不要以爲SQL會做你認爲它應該做的事情,而是需要額​​外的努力(比如說,輸入「not null」)在你給計算機的方向上清楚。 – 2011-06-01 17:00:18