首页 > 解决方案 > 打印不带括号的检查约束

问题描述

我有这个 DDL:

CREATE TABLE checkout_value (
    id BIGSERIAL PRIMARY KEY,
    start_value INTEGER,
    end_value INTEGER,
);

考虑到电子商务,我想保存几个可能的值范围,将来的规则将在结账时应用。例子:

  1. 价值直到 20 美元
  2. 价值 400 美元起
  3. 30 美元到 300 美元之间

这样,我想允许一个空值,但如果两者都不为空,start_value则应小于end_value.

我虽然关于触发器,但我正在尝试使用检查约束来做到这一点,这样:

CREATE TABLE checkout_value (
    id BIGSERIAL PRIMARY KEY,
    start_value INTEGER,
    end_value INTEGER,
    CHECK 
    (
        (start_value IS NOT NULL AND end_value IS NULL)
        OR
        (start_value IS NULL AND end_value IS NOT NULL)
        OR
        (start_value IS NOT NULL AND end_value IS NOT NULL AND end_value > start_value)
    )
);

这行得通!但是当我运行时\d checkout_value,它打印时没有任何括号:

Check constraints:
  "checkout_value_check" CHECK (start_value IS NOT NULL AND end_value IS NULL OR start_value IS NULL AND end_value IS NOT NULL OR start_value IS NOT NULL AND end_value IS NOT NULL AND end_value > start_value)

如果没有括号,这将导致不需要的规则。这是打印表格详细信息的错误吗?在以更明确的方式记录这些规则的同时,是否有更简单的应用方法?

标签: postgresqlcheck-constraints

解决方案


AND绑定比 强OR,所以两个版本是等价的。PostgreSQL 不存储字符串,而是存储已解析的表达式。


推荐阅读