我試圖將一個檢查約束SQLite中,其中要求如下:檢查約束指定的值可能爲空或約束
- 的值可以是空
- 如果值不爲空,那麼它應該是大於3
所以,在我創建的表我寫
create table T(A real check(A = null or A>3));
爲此,它看起來像創建表,但它不強制執行大於條件。
而且我也試過
create table T(A real check(A is null or A>3));
這還不首先創建表。
有人請幫助如何執行這兩個約束?
謝謝
我試圖將一個檢查約束SQLite中,其中要求如下:檢查約束指定的值可能爲空或約束
所以,在我創建的表我寫
create table T(A real check(A = null or A>3));
爲此,它看起來像創建表,但它不強制執行大於條件。
而且我也試過
create table T(A real check(A is null or A>3));
這還不首先創建表。
有人請幫助如何執行這兩個約束?
謝謝
爲什麼你需要兩個?只要允許該字段爲NULL,並使條件A> 3。本場要麼是NULL,或NOT NULL,大於3 ...
CREATE TABLE (A real NULL check(A>3))
如果我有 「create table T(A real check(A> 3));」,它會照顧兩種情況嗎? 不會限制空值,因爲那麼當A爲null時,null不能大於3,因此檢查將失敗。 –
@VinayakAgarwal:用5分鐘寫出一些'INSERT'語句真的很難嗎?只要有可能,我們也很重視個人的努力。 – mellamokb
從SQL-92標準:
表檢查約束是滿意的,當且僅當指定 搜索條件對於表中的任何行都不是錯誤的。
如果A
爲空,那麼由於SQL的三值邏輯,A > 3
將評估爲UNKNOWN。由於UNKNOWN不是FALSE,約束條件將得到滿足。
想一想,如果標準沒有以這種方式編寫,那麼每個約束都必須明確地測試null,這對編碼人員來說更加「噪音」和痛苦。
工作對我來說很好:http://www.ideone.com/ERbhM – mellamokb
我會的。但我想我有一個後續。爲了在這裏詢問,我已經簡化了這個問題。問題仍然存在,因爲我正在做類似「create table T(真正的檢查(A爲空或A> B),B爲真)」,也可能是因爲我在聲明它之前訪問B,它給了我約束錯誤。對此有任何破解? –
解決了它。謝謝你的幫助。 –