不带括号打印检查约束

check constraint being printed without parenthesis

我有这个 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)

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

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