2013-02-07 144 views
4

今天,我發現在桌子上的一個有趣的約束:檢查約束

alter table T1 add constraint C$T1_DUMMY check (null is null); 

任何想法,爲什麼我們需要這個?

+0

我想不出有任何理由有這個約束。您的DDL版本是否受到控制?理想情況下,創建該約束的腳本將會有註釋。或者您可以查看存儲庫歷史記錄,查看誰進行了更改,何時以及爲什麼(如果他們留下了有用的評論)。 –

+1

該命令可能已使用含有微弱驗證的查詢從某些自定義數據字典中自動生成。或者 - 正如其名稱所暗示的 - 約束被認爲是某種模板。 – collapsar

+3

這是一個現實檢查。當它失敗時,我們知道世界已經結束。或者Oracle有一個基本的錯誤。這幾乎相同的東西:) –

回答

0

答案很簡單。

條件null is null將始終返回true。因此,CHECK語句總是返回true,因此不會強制執行任何其他業務邏輯。很可能這就是爲什麼約束被命名爲C$T1_DUMMY

我也在我自己的機器上,在emp表上使用了Oracle自己的示例模式。完美的作品。除了語法錯誤和其他約束的強制執行之外,什麼都不會被禁止。

+1

正確。我只會添加一個始終爲真的約束永遠不會是錯誤的,並且從不假的約束不是 - 在邏輯意義上 - 約束。這在邏輯上是無效的,你不需要它。只要刪除它。 –

+0

是的,詹姆斯是對的。和約束「C $ T1_DUMMY」的名稱一樣 - 它只是一個虛擬約束。它可能是爲了檢查用戶是否有權限向表中添加約束而創建的。如果你不需要它,你可以將其刪除,或者在那裏看到它不舒服。 – Rachcha