检查约束
检查约束是最通用的约束类型。它允许您指定某列中的值必须满足布尔值(真值)表达。例如,要求正面的产品价格,您可以使用:
vastbase=# CREATE TABLE products ( product_no integer, name text, price numeric CHECK (price > 0) );
如您所见,约束定义位于数据类型之后,就像默认值定义一样。可以按任何顺序列出默认值和约束。检查约束由关键字 CHECK 和括号中的表达式组成。检查约束表达式应该涉及这样约束的列,否则约束不会有太多意义。
您还可以为约束指定单独的名称。这澄清了错误消息,并允许您在需要更改时引用约束。语法是:
vastbase=# CREATE TABLE products ( product_no integer, name text, price numeric CONSTRAINT positive_price CHECK (price > 0) );
因此,要指定命名约束,请使用关键字 CONSTRAINT,后跟标识符,后跟约束定义。(如果没有以这种方式指定约束名称,系统会为您选择一个名称。)
检查约束也可以引用多个列。假设您存储正常价格和折扣价格,并且您希望确保折扣价格低于正常价格:
vastbase=# CREATE TABLE products ( product_no integer, name text, price numeric CHECK (price > 0), discounted_price numeric CHECK (discounted_price > 0), CHECK (price > discounted_price) );
前两个约束应该看起来很熟悉。第三个使用新语法。它未附加到特定列,而是显示为逗号分隔列列表中的单独项。列定义和这些约束定义可以按混合顺序列出。
我们说前两个约束是列约束,而第三个约束是表约束,因为它与任何一个列定义分开编写。列约束也可以写为表约束,而反向不一定是可能的,因为列约束应该仅引用它所附加的列。(Vastbase不强制执行该规则,但如果您希望表定义与其他数据库系统一起使用,则应遵循该规则。)上述示例也可以写为:
vastbase=# CREATE TABLE products ( product_no integer, name text, price numeric, CHECK (price > 0), discounted_price numeric, CHECK (discounted_price > 0), CHECK (price > discounted_price) );
甚至:
vastbase=# CREATE TABLE products ( product_no integer, name text, price numeric CHECK (price > 0), discounted_price numeric, CHECK (discounted_price > 0 AND price > discounted_price) );
可以使用与列约束相同的方式将名称分配给表约束:
vastbase=# CREATE TABLE products ( product_no integer, name text, price numeric, CHECK (price > 0), discounted_price numeric, CHECK (discounted_price > 0), CONSTRAINT valid_discount CHECK (price > discounted_price) );
应当注意,如果检查表达式的计算结果为真或空值,则满足检查约束。由于如果任何操作数为null,大多数表达式将计算为空值,因此它们不会阻止受约束列中的空值。要确保列不包含空值,可以使用下一节中描述的非空约束。