CHECK约束指定了在INSERTUPDATE语句中必须为布尔表达式返回TRUE或者NULL。如果值返回FALSE,则整个语句被拒绝。

细节

warranty_period INT CHECK (warranty_period >= 0) CHECK (warranty_period <= 24)

应指定为:

warranty_period INT CHECK (warranty_period BETWEEN 0 AND 24)

语法

可以在表级别定义CHECK约束,如果你只想给一列添加约束,也可以在列级别添加。

你可以使用ADD CONSTRAINT给已有表添加CHECK约束

Column Level

图片

Parameter Description
table_name 表名
column_name 受约束列的名称
column_type 受约束列的数据类型
check_expr 一个返回布尔类型值的表达式; 如果表达式值为FALSE,则该值无法被插入。
column_constraints 要应用于此列的任何其他列级约束。
column_def 表中任何其他列的定义。
table_constraints 要应用的任何表级约束。

举例

> CREATE TABLE inventories (
    product_id        INT NOT NULL,
    warehouse_id      INT NOT NULL,
    quantity_on_hand  INT NOT NULL CHECK (quantity_on_hand > 0),
    PRIMARY KEY (product_id, warehouse_id)
  );

Table Level

图片

Parameter Description
table_name 表名
column_def 表中任何其他列的定义。
name 约束名, 需要在表中唯一,并且符合identifier rules.
check_expr 一个返回布尔类型值的表达式; 如果表达式值为FALSE,则该值无法被插入。
table_constraints 要应用的任何表级约束。

举例

> CREATE TABLE inventories (
    product_id        INT NOT NULL,
    warehouse_id      INT NOT NULL,
    quantity_on_hand  INT NOT NULL,
    PRIMARY KEY (product_id, warehouse_id),
    CONSTRAINT ok_to_supply CHECK (quantity_on_hand > 0 AND warehouse_id BETWEEN 100 AND 200)
  );

用法示例

可以在列级或表级指定CHECK约束,并可以引用表中的其他列。在内部,所有列级CHECK约束都转换为表级约束,因此可以一致地处理它们。

> CREATE TABLE inventories (
    product_id        INT NOT NULL,
    warehouse_id      INT NOT NULL,
    quantity_on_hand  INT NOT NULL CHECK (quantity_on_hand > 0),
    PRIMARY KEY (product_id, warehouse_id)
  );

> INSERT INTO inventories (product_id, warehouse_id, quantity_on_hand) VALUES (1, 2, 0);
pq: failed to satisfy CHECK constraint (quantity_on_hand > 0)

See Also