资源描述:
《数据库表约束》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、SQL表约束约束数据类型是限制我们可以在表里存储什么数据的一种方法。不过,对于许多应用来说,这种限制实在是太粗糙了。比如,一个包含产品价格的字段应该只接受正数。但是没有哪种标准数据类型只接受正数。另外一个问题是你可能需要根据其它字段或者其它行的数据来约束字段数据。比如,在一个包含产品信息的表中,每个产品编号都应该只有一行。对于这些问题,SQL允许你在字段和表上定义约束。约束允许你对数据施加任意控制。如果用户企图在字段里存储违反约束的数据,那么就会抛出一个错误。这种情况同时也适用于数值来自缺省值的情况。5.3.1.检查约束检查约束是最常见的约束类型。它允
2、许你声明在某个字段里的数值必须使一个布尔表达式为真。比如,要强制一个正数的产品价格,你可以用:CREATETABLEproducts( product_nointeger, nametext, pricenumericCHECK(price>0));如你所见,约束定义在数据类型之后,就好像缺省值定义一样。缺省值和约束可以按任意顺序排列。一个检查约束由一个关键字CHECK后面跟一个放在圆括弧里的表达式组成。检查约束表达式应该包含受约束的字段,否则这个约束就没什么意义了。你还可以给这个约束取一个独立的名字。这样就可以令错误信息更清晰,并且在你需
3、要修改它的时候引用这个名字。语法是:CREATETABLEproducts( product_nointeger, nametext, pricenumericCONSTRAINTpositive_priceCHECK(price>0));因此,要声明一个命名约束,使用关键字CONSTRAINT后面跟一个标识符(作为名字),然后再跟约束定义。如果你不用这个方法声明约束,那么系统会自动为你选择一个名字。一个检查约束也可以引用多个字段。假设你存储一个正常价格和一个折扣价,并且你想保证折扣价比正常价低。CREATETABLEproducts(
4、 product_nointeger, nametext, pricenumericCHECK(price>0), discounted_pricenumericCHECK(discounted_price>0), CHECK(price>discounted_price));头两个约束看上去很面熟。第三个使用了一个新的语法。它没有附着在某个字段上,而是在逗号分隔的字段列表中以一个独立行的形式出现。字段定义和约束定义可以按照任意顺序列出。我们称头两个约束是"字段约束",而第三个约束是"表约束"(和字段定义分开写)。字段约束也可以写成表约
5、束,而反过来很可能不行,因为系统假设字段约束只引用它所从属的字段。PostgreSQL并不强制这条规则,但是如果你希望自己的表定义可以和其它数据库系统兼容,那么你最好还是遵循这条规则。上面的例子也可以这么写:CREATETABLEproducts( product_nointeger, nametext, pricenumeric, CHECK(price>0), discounted_pricenumeric, CHECK(discounted_price>0), CHECK(price>discounted_price)
6、);或者是CREATETABLEproducts( product_nointeger, nametext, pricenumericCHECK(price>0), discounted_pricenumeric, CHECK(discounted_price>0ANDprice>discounted_price));这只是风格的不同。和字段约束一样,我们也可以给表约束赋予名称,方法也相同:CREATETABLEproducts( product_nointeger, nametext, pricenumeric,
7、CHECK(price>0), discounted_pricenumeric, CHECK(discounted_price>0), CONSTRAINTvalid_discountCHECK(price>discounted_price));我们还要注意的是,当约束表达式计算结果为NULL的时候,检查约束会被认为是满足条件的。因为大多数表达式在含有NULL操作数的时候结果都是NULL,所以这些约束不能阻止字段值为NULL。要确保一个字段值不为NULL,可以使用下一节介绍的非空约束。5.3.2.非空约束非空约束只是简单地声明一个字段必须不
8、能是NULL。下面是一个例子:CREATETABLEproducts( product_n