VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

检查约束

检查约束是最通用的约束类型。它允许您指定某列中的值必须满足布尔值(真值)表达。例如,要求正面的产品价格,您可以使用:

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,大多数表达式将计算为空值,因此它们不会阻止受约束列中的空值。要确保列不包含空值,可以使用下一节中描述的非空约束。