2015-01-11 31 views
1

我有一個主鍵,9個NOT NULL字段和15個ALLOW NULL字段的表。插入表中無值

如何在表格中插入一行而不必顯式設置9個字段的值?

+6

可以定義表格具有這些列的默認值。否則,你必須指定一些東西。 –

+1

@GordonLinoff請注意,如果有一個合理的,你應該只定義一個默認值。如果你真的需要指定所有這些字段,那麼你絕對應該*不*具有默認值。在這種情況下,你應該咧嘴一笑,並指定它們。根據我的經驗,合理的違約很難得到。 – jpmc26

+1

@ jpmc26我傾向於同意並回避他們。我發現回覆它們往往會導致人們忘記那些字段在那裏,或者在以可能使缺省無效(即不再合理)的方式更新系統時考慮它們的初始值。所以我傾向於將它們主要用於設置CreatedOn/ModifiedOn審計字段。但是,有些情況下,他們是有幫助的,人們應該知道如何與他們互動(因此我的答案)。例如,使用默認值創建測試表可以輕鬆生成行,而只需處理需要不同值的字段。 –

回答

1

假設你有那些9個NOT NULL字段創建默認值,你有三種選擇:

  • 不要使用DEFAULT VALUES任何字段設置值。

  • 不要通過在INSERT列表或VALUES列表中指定這些字段來設置NOT NULL字段的值。

  • 不要設置爲NOT NULL字段的值,假設他們是在INSERT列列表中指定,使用DEFAULT關鍵字,而不是值

實施例示出每一個選項,以及明確地插入NULL到具有默認一個可爲空場的效果:

DECLARE @Test TABLE 
(
    ID INT NOT NULL IDENTITY(1, 1) PRIMARY KEY, 
    NotNullField DATETIME NOT NULL DEFAULT (GETDATE()), 
    NullableFieldWithDefault DATETIME NULL DEFAULT (GETDATE()), 
    NullableFieldWithNoDefault DATETIME NULL 
); 

-- No values specified for any fields 
INSERT INTO @Test DEFAULT VALUES; 

-- Values specified only for NULLable field with no default 
INSERT INTO @Test (NullableFieldWithNoDefault) VALUES ('2112-12-21'); 

-- DEFAULT keyword used for fields with a default 
INSERT INTO @Test (NotNullField, NullableFieldWithDefault, NullableFieldWithNoDefault) 
VALUES (DEFAULT, DEFAULT, '1999-03-15'); 

-- NULLs specified for NULLable fields 
INSERT INTO @Test (NullableFieldWithDefault, NullableFieldWithNoDefault) 
VALUES (NULL, NULL); 


SELECT * FROM @Test; 

結果:

ID NotNullField    NullableFieldWithDefault NullableFieldWithNoDefault 
-- ----------------------- ------------------------ -------------------------- 
1 2015-01-11 16:22:31.317 2015-01-11 16:22:31.317 NULL 
2 2015-01-11 16:22:31.320 2015-01-11 16:22:31.320 2112-12-21 00:00:00.000 
3 2015-01-11 16:22:31.320 2015-01-11 16:22:31.320 1999-03-15 00:00:00.000 
4 2015-01-11 16:22:31.320 NULL      NULL