2011-11-16 153 views
3

我試圖將一個檢查約束SQLite中,其中要求如下:檢查約束指定的值可能爲空或約束

  1. 的值可以是空
  2. 如果值不爲空,那麼它應該是大於3

所以,在我創建的表我寫

create table T(A real check(A = null or A>3)); 

爲此,它看起來像創建表,但它不強制執行大於條件。

而且我也試過

create table T(A real check(A is null or A>3)); 

這還不首先創建表。

有人請幫助如何執行這兩個約束?

謝謝

+2

工作對我來說很好:http://www.ideone.com/ERbhM – mellamokb

+0

我會的。但我想我有一個後續。爲了在這裏詢問,我已經簡化了這個問題。問題仍然存在,因爲我正在做類似「create table T(真正的檢查(A爲空或A> B),B爲真)」,也可能是因爲我在聲明它之前訪問B,它給了我約束錯誤。對此有任何破解? –

+0

解決了它。謝謝你的幫助。 –

回答

4

爲什麼你需要兩個?只要允許該字段爲NULL,並使條件A> 3。本場要麼是NULL,或NOT NULL,大於3 ...

CREATE TABLE (A real NULL check(A>3)) 
+0

如果我有 「create table T(A real check(A> 3));」,它會照顧兩種情況嗎? 不會限制空值,因爲那麼當A爲null時,null不能大於3,因此檢查將失敗。 –

+0

@VinayakAgarwal:用5分鐘寫出一些'INSERT'語句真的很難嗎?只要有可能,我們也很重視個人的努力。 – mellamokb

4

從SQL-92標準:

表檢查約束是滿意的,當且僅當指定 搜索條件對於表中的任何行都不是錯誤的。

如果A爲空,那麼由於SQL的三值邏輯,A > 3將評估爲UNKNOWN。由於UNKNOWN不是FALSE,約束條件將得到滿足。

想一想,如果標準沒有以這種方式編寫,那麼每個約束都必須明確地測試null,這對編碼人員來說更加「噪音」和痛苦。