2011-11-16 152 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,这对编码人员来说更加“噪音”和痛苦。