在计算机科学和软件工程中,约束检查是指在程序运行时对变量或数据进行检查,确保其满足一定的规则或条件。这些规则或条件可以是预定义的,也可以是通过编程语言的约束机制定义的。
约束检查可以用于检查以下方面:
约束检查对于保证程序的正确性和可靠性至关重要,可以避免一些潜在的错误和异常情况的发生,提高程序的质量和性能。
检查约束是最通用的约束类型。它允许您指定特定列中的值必须满足布尔值(真值)表达式。例如,要要求产品价格为正,您可以使用:
CREATE TABLE products (
product_no integer,
name text,
price numeric CHECK (price > 0)
);
如您所见,约束定义位于数据类型之后,就像默认值定义一样。默认值和约束可以按任意顺序列出。检查约束由关键字和括号中的表达式组成。检查约束表达式应涉及受此约束的列,否则约束将没有太大意义。
还可以为约束指定一个单独的名称。这阐明了错误消息,并允许您在需要更改约束时引用约束。语法为:
CREATE TABLE products (
product_no integer,
name text,
price numeric CONSTRAINT positive_price CHECK (price > 0)
);
因此,若要指定命名约束,请使用关键字CONSTRAINT后跟标识符,后跟约束定义。(如果不以这种方式指定约束名称,系统将为您选择一个名称。
CHECK 约束还可以引用多个列。假设您存储了正常价格和折扣价格,并且您希望确保折扣价格低于正常价格:
CREATE TABLE products (
product_no integer,
name text,
price numeric CHECK (price > 0),
discounted_price numeric CHECK (discounted_price > 0),
CHECK (price > discounted_price)
);
前两个约束应该看起来很熟悉。第三个使用新语法。它不附加到特定列,而是在逗号分隔的列列表中显示为单独的项目。列定义和这些约束定义可以按混合顺序列出。
我们说前两个约束是列约束,而第三个约束是表约束,因为它是与任何一个列定义分开编写的。列约束也可以写成表约束,而反之则不一定可行,因为列约束应该只引用它所附加到的列。(PostgreSQL 不强制执行该规则,但如果您希望表定义与其他数据库系统一起使用,则应遵循该规则。上面的例子也可以写成:
CREATE TABLE products (
product_no integer,
name text,
price numeric,
CHECK (price > 0),
discounted_price numeric,
CHECK (discounted_price > 0),
CHECK (price > discounted_price)
);
甚至:
CREATE TABLE products (
product_no integer,
name text,
price numeric CHECK (price > 0),
discounted_price numeric,
CHECK (discounted_price > 0 AND price > discounted_price)
);
可以采用与列约束相同的方式将名称分配给表约束:
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)
);
应该注意的是,如果 check 表达式的计算结果为 true 或 null 值,则满足 CHECK 约束。由于如果任何操作数为 null,大多数表达式的计算结果为 null 值,因此它们不会阻止约束列中的 null 值。若要确保列不包含 null 值,可以使用下一节中描述的 not-null 约束。