2015-09-18 76 views
0

所以我有一張桌子的工作有很多默認值:SQL:具有「基本爲空」默認值的目的是什麼?

CREATE TABLE BLAH.BLAH 
    (
     ... 
     A NUMBER(19)  DEFAULT 0 NOT NULL, 
     B VARCHAR2(50) DEFAULT ' ' NOT NULL, 
     C TIMESTAMP(6) DEFAULT '01-JAN-1900' NOT NULL, 
     ... 
    ) 

我只是想知道是否有這樣的空般的默認設置到會好得多列任何邏輯的目的(在我意見)被設置爲實際的NULL。

編輯:我主要是用VARCHAR2默認惱火。其他人更合理,更容易合作。當很多代碼涉及修剪時,這只是一個痛苦;當我期待一個空間時,我得到NULL。

+0

我可能會使用NULLS - 它們表示沒有值 - 原因可能是因爲消費應用程序無法處理NULL值,因此可能值得查看使用數據的應用程序 – Charleh

+1

並非所有事情都已完成有一個很好的理由。這是其中之一。 – Hogan

+0

將''''作爲空VARCHAR的默認值似乎也是一個糟糕的主意 - 我會使用'''' – Hogan

回答

3

如果你瞭解空,並用來對付他們來說並沒有太大的意義。

在它自己的瘋狂世界中,它具有某種邏輯,因爲如果你從來沒有空值,那麼值更容易映射到編程語言(都有整數類型,但不是全都有可爲空的整數類型) '平等'更容易(0 = 0,但它不是null = null)。但是權衡是你必須通過程序中的樣板檢查和任何SQL查詢來處理這些神奇的默認值。

這也可能是一些誤用的,貨物編碼的「編碼標準」的結果,它禁止在數據庫中使用可爲空的列,並且還需要具有某種「未知」值。

這是事實,空的SQL(和一般的關係模型)列入增加了複雜性和一直存在爭議。 (我不打算在此引用全文,或者爲任何特定觀點爭辯;我只是說這些論點存在。)有些人認爲,如果您需要空列,您應該修改數據模型完全正常化;科德認爲,單一的空值是不夠的,應該有單獨的「缺失」和「不適用」。但我敢肯定,誰主張擺脫null沒有人建議用一個假的01900-01-01值,而不是取代它......如此反覆它可能是誤解和誤用關於不使用空值的一些設計規則的情況。

這種扭曲的思維過程中是很常見的 - 我繼承了一個數據庫,其中的規則禁止空列(並有依賴於原料藥),但字符串「?」被用來代替。事實上,這意味着'?'和'/'表示'缺少'和'不適用' - 遵循Codd的建議 - 但是你可以猜測有多少真實世界的數據或代碼觀察到了這種區分以及它在實踐中的有用程度。

1

有沒有原因?可能有一些發展小組。當你說:

select * 
from blah 
where timestamp <> date '2015-01-01' 

您可能希望查詢返回默認值。如果默認值是NULL,那麼查詢將不會返回它們。如果默認是過去的日期,那麼它會。

同樣,你可能不希望有很多的or X is null雜波代碼。這可能不僅僅是一個美學問題。在whereonor的存在爲代碼錯誤提供了機會(由於缺少括號)並且可能會混淆優化程序。

我是而不是表示使用這種默認值是一種最佳實踐。NULL是SQL語言的重要組成部分,任何編寫生產代碼的人都應該知道如何處理它。但是,你提到的風格有很好的理由。

相關問題